在awk脚本中它意味着什么? `awk -F“|” '{!a [$ 1] ++} {printf RS $ 1} {print FS $ 2}'input.txt`

时间:2013-08-23 07:04:48

标签: awk

我需要在unix中使用以下代码的含义,并帮助我继续前进..

`awk -F "|" '{!a[$1]++}{printf RS $1}{print FS $2}' input.txt`

我的样本i / p文件如下所示

1|Balaji 1|Kumar 3|India 3|China 3|Australia 1|Dinesh

我需要o / p,如下所示

1|Balaji|Kumar|Dinesh 3|India|China|Australia

3 个答案:

答案 0 :(得分:2)

我不会解释你问题中的awk行。因为它没有多大意义:

  • 创建了数组a [],但从不使用
  • 错误使用RS,FS

试试这个单行:

awk -F'[| ]' '{for(i=1;i<=NF;i++)if(i%2)a[$i]=a[$i]?a[$i]"|"$(i+1):$(i+1)}
END{for(x in a) printf x"|"a[x]" ";print ""}' file

以你的例子:

kent$ echo "1|Balaji 1|Kumar 3|India 3|China 3|Australia 1|Dinesh"|awk -F'[| ]' '{for(i=1;i<=NF;i++)if(i%2)a[$i]=a[$i]?a[$i]"|"$(i+1):$(i+1)}END{for(x in a) printf x"|"a[x]" ";print ""}'
1|Balaji|Kumar|Dinesh 3|India|China|Australia

请注意,会有一个结束空格,可以在END循环中删除它。

答案 1 :(得分:1)

令人惊讶的是,它可以简单地改变。我不知道为什么!一个[$ 1] ++写在里面。它在那里过时了:

awk -F "|" '{printf RS $1}{print FS $2}' input.txt

它将首先打印记录分隔符,即newline,然后是$ 1,这是第一个字段,然后是字段分隔符,它是“|”然后是第二个字段$ 2然后换行(因为语句是打印的。如果使用printf,则不会打印换行符。)

根据您的评论,以下内容应该有效:

   awk '{
        for(i=1;i<=NF;i++){split($i,a,"|");
                           b[a[1]]?b[a[1]]=b[a[1]]" "a[2]:b[a[1]]=a[2]
                          }
        for(j in b)printf j"|"b[j]" ";
        print"";}' your_file

答案 2 :(得分:1)

更改记录选择器可以轻松读取此数据。它只有一个小错误,我看不到如何解决,它打印在两行。

awk -F\| '{a[$1]=a[$1]?a[$1]"|"$2:$2} END{for(i in a) printf i"|"a[i]" "}' RS=" " file
1|Balaji|Kumar|Dinesh
 3|India|China|Australia 

由于Birei

,输出正确的新版本
awk -F\| '{sub(/\n/,x, $0); a[$1]=a[$1]?a[$1]"|"$2:$2} END{for(i in a) printf i"|"a[i]" "}' RS=" "
1|Balaji|Kumar|Dinesh 3|India|China|Australia