-1

我需要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
4

3 回答 3

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 循环中删除。

于 2013-08-23T08:38:22.907 回答
1

令人惊讶的是,它可以更改为简单。我不确定为什么 !a[$1]++ 写在里面。它已经过时了:

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

它将首先打印记录分隔符,它是换行符,然后是 $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
于 2013-08-23T07:12:30.640 回答
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 
于 2013-08-23T08:52:03.123 回答