仅当字段1等于sed或awk时,才连接两行

仅当字段1等于sed或awk时,才连接两行,sed,awk,Sed,Awk,输入文件: $ cat t.txt id1;value1_1 id1;value1_2 id2;value2_1 id3;value3_1 id4;value4_1 id4;value4_2 id5;value5_1 结果将是: id1;value1_1;id1;value1_2 id3;value3_1 id4;value4_1;id4;value4_2 id5;value5_1 id1;value1_1;id1;value1_2 id2;value2_1 id3;value3_1 id4

输入文件:

$ cat t.txt
id1;value1_1
id1;value1_2
id2;value2_1
id3;value3_1
id4;value4_1
id4;value4_2
id5;value5_1
结果将是:

id1;value1_1;id1;value1_2
id3;value3_1
id4;value4_1;id4;value4_2
id5;value5_1
id1;value1_1;id1;value1_2
id2;value2_1
id3;value3_1
id4;value4_1;id4;value4_2
id5;value5_1

使用sed或awk。请给出您的意见。

我想在您的结果示例中,id2;线路错漏了,对吗

无论如何,您可以尝试下面的awk行:

awk -F';' '{a[$1]=($1 in a)?a[$1]";"$0:$0}END{for(x in a)print a[x]}' yourFile|sort
产出将是:

id1;value1_1;id1;value1_2
id3;value3_1
id4;value4_1;id4;value4_2
id5;value5_1
id1;value1_1;id1;value1_2
id2;value2_1
id3;value3_1
id4;value4_1;id4;value4_2
id5;value5_1

这里有一种方法:

awk -F';' 'BEGIN { getline; id=$1; line=$0 } { if ($1 != id) { print line; line = $0; } else { line = line ";" $0; } id=$1; } END { print line; }' t.txt
说明:

将字段分隔符设置为

-F';'
首先读取输入的第一行(
getline
),将第一个字段(
$1
)保存为
id
,将第一行(
$0
)保存为

BEGIN { getline; id=$1; line=$0 }
END { print line; }
对于每行输入,检查第一个字段是否与存储的id不同:

if ($1 != id)
如果有,则打印保存的行并存储新行(
$0
):

否则,请将新行附加到存储的行:

并保存新id:

id=$1
最后,打印
行中剩余的内容

BEGIN { getline; id=$1; line=$0 }
END { print line; }

这可能适合您:

 sed -e '1{h;d};H;${x;:a;s/\(\([^;]*;\)\([^\n]*\)\)\n\2/\1;\2/;ta;p};d' t.txt
说明:

将文件插入以保留空间(HS),然后在文件结束时交换到HS,并使用替换连接具有重复键的行并打印。注意:通常打印的行全部删除

编辑:

上述解决方案有效(据我所知),但对于大容量而言,速度不是很快(读取速度非常慢)。此解决方案更好:

# cat -A /tmp/t.txt 
id1;value1_1$
id1;value1_2$
id2;value2_1$
id3;value3_1$
id4;value4_1$
id4;value4_2$
id5;value5_1$
# for x in {1..1000};do cat /tmp/t.txt;done | 
> sed ':a;$!N;/^\([^;]*;\).*\n\1/s/\n//;ta;P;D'| sort | uniq
id1;value1_1;id1;value1_2
id2;value2_1
id3;value3_1
id4;value4_1;id4;value4_2
id5;value5_1

是否要求使用该命令?这可以通过for循环在bash中完成。第一种选择是使用awk或sedbtw,到目前为止,您已经提出了两个非常类似的问题。您是否考虑过接受您的问题的正确答案?您的另一个问题:正确,但使用前面的awk语句,如id2;值2_1,id3;值3_1。。如果你没有得到你想要的答案,可能是因为你没有在问题中提供正确的信息。请阅读此优秀指南:。请努力改进现有问题,而不是将其重新表述为新问题;应该添加id2行。它起作用了。谢谢小评论:结果显示了每行的开头烧焦id1;价值1_1;id1;价值1_2;id2;价值2_1;id3;价值3_1;id4;价值4_1;id4;价值4_2;id5;价值5_1$awk-F'”{a[$1]=(a中的$1)?a[$1]”;“$0:$0}END{for(a中的x)打印a[x]}”id1;值1_1
;id1;value1_2

因此连接不会发生(我对注释编辑器有问题-该
不会导致“\n”)@user1042891参见编辑-我改进了解决方案,并在1200行以上的卷上进行了测试。数据是棘手的东西,它并不总是尊重你的意愿,可能需要事先清理;不要使用cat t.txt;完成| sed-e:a;Ns/^\([^;]*;\)\([^\n]*\)\n\1/\1\2\1/;助教;PD'|排序| uniq===>结果:;id1;值1_2 id1;值1_2 id2;值2_1 id3;价值3_1;id4;值4_2 id5;值51 id5;价值51;值1\u 1

我有一个不同的result@user1042891如我所说,请检查您的数据。请尝试
cat-A t.txt
。可能是你们在行首或行尾有一些奇怪的字符。