在unix中第7次出现分隔符后打印文本

时间:2016-11-01 17:09:30

标签: unix awk

我的文本文件遵循以下格式:

    name   loc  -   u   q1:a|b|c|d|e|f|g|h   q2:i|j|k|l|m|n|o|p

对于每一行,我想在第7次出现" |"之后提取文本。对于每个" q"在那条线上。换句话说,我想打印这样的东西:

            q1    q2
    name    h     p

有没有办法可以在没有循环的情况下使用awk或grep执行此操作?

提前致谢!

2 个答案:

答案 0 :(得分:0)

您可以尝试以下解决方案 -

  

输入

  vipin@kali:~$ cat kk.txt
    q1:a|b|c|d|e|f|g|h   q2:i|j|k|l|m|n|o|p
  

输出

vipin@kali:~$ awk 'BEGIN{FS=":|\|| "} {print $2,$12,$23} END {print $1,$20,$31}' OFS="\t" kk.txt
        q1      q2
name    h       p
  

解释

我们需要使用多个字段分隔符:[Space]|来划分列和打印所需的输出。

答案 1 :(得分:0)

我认为字段之间的空格是制表符。由于你使用q1和q2作为标题,我猜它们出现在每一行上 首先,你需要切出第二,第三和第四场。 cut在这里很容易。 对于每个剩余的字段,您需要相同的sed - 操作。像

这样的东西
echo "name      loc     -       u       q1:a|b|c|d|e|f|g|h      q2:i|j|k|l|m|n|o|p"  | cut -f1,5- |
sed 's/[^\t]*:\([^|]*|\)\{7\}/ /g'