我需要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
我需要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
我不会在你的问题中解释 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 循环中删除。
令人惊讶的是,它可以更改为简单。我不确定为什么 !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
更改记录选择器可以轻松读取此数据。它只有一个我不知道如何解决的小错误,它在两行上打印出来。
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