我需要在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
答案 0 :(得分:2)
我不会解释你问题中的awk行。因为它没有多大意义:
试试这个单行:
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