输入文件:
$ 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
使用sed或awk。请提出你的意见。
答案 0 :(得分:5)
这是一种方法:
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
)保存为{ {1}}:
line
对于每行输入,检查第一个字段是否与存储的ID不同:
BEGIN { getline; id=$1; line=$0 }
如果是,则打印保存的行并存储新行(if ($1 != id)
):
$0
否则,将新行追加到存储的行:
print line; line = $0;
并保存新ID:
line = line ";" $0;
最后,打印id=$1
中剩下的内容:
line
答案 1 :(得分:1)
我猜你的结果例子中,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
id2;value2_1
id3;value3_1
id4;value4_1;id4;value4_2
id5;value5_1
答案 2 :(得分:1)
这可能对您有用:
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