在awk脚本中它意味着什么`awk-F“|”{!a[$1]+}{printfrs$1}{printfs$2}input.txt`

在awk脚本中它意味着什么`awk-F“|”{!a[$1]+}{printfrs$1}{printfs$2}input.txt`,awk,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 1|Balaji|Kumar|Dinesh 3|India|China|Australia 我需要下面这样的订单 1|Balaji 1|Kumar 3|India 3|China 3|Au

我需要以下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
1|Balaji|Kumar|Dinesh 3|India|China|Australia
我需要下面这样的订单

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

令人惊讶的是,它可以简单地改变。我不知道为什么!一个[$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的意思。因为这没有多大意义:

已创建数组[],但从未使用 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

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

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

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 

我的示例i/p文件如下1 |巴拉吉1 |库马尔3 |印度3 |中国3 |澳大利亚1 |迪内什我需要o/p如下1 |巴拉吉|库马尔|迪内什3 |印度|中国|澳大利亚假设这些名称可以有空格。我说得对吗?另外,您是否仍在使用awk,还是会接受更强大的语言,如perl或python?为什么?你在输入的情况下说出你想要的输出,但不知道为什么Dinesh在输入后得到一个3,Kumar从中删除了3,等等。我们只是猜测,可能会给你一个完全不合适的答案,为特定的输入生成输出,但在一般情况下是错误的。顺便说一下,您发布的awk脚本完全是胡说八道,因此没有必要对其进行解释。我认为,当您更改记录分隔符变量RS时,awk不会删除最后一个换行符,因此您需要手动执行此操作。使用sub:sub/\n/,$0的单向输入有两种输入错误。第二个字段是替换字符串,在本例中应为空,第三个字段是变量,我选择了$0,但也可能是最后一个,$NF。其中任何一个都需要美元符号。我确实错过了0美元中的美元,修正了。使用x是将其设置为空白的一种方法,因为x不存在,所以它是空白的。我可以用,但是x短一点,没关系。简单地说,这个变量让你环顾四周两次,然后才意识到它的含义。较短但可读性较差。