仅当field-1与sed或awk等于时才加入2行

时间:2011-11-20 10:59:16

标签: 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

使用sed或awk。请提出你的意见。

3 个答案:

答案 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