文本文件的输入
A | 1 | def | 1432
A | 1 | ffr | 1234
A | 1 | dfs | 3241
A | 2 | asf | 2213
期望的输出
A | 1 | def 1432,ffr 1234,dfs 3241
A | 2 | asf 2213
在单行中合并与第二列相关的值
您的问题没有很好地说明,但这是解决问题的一步:
awk -F\| '{ a[$1 "|" $2] = a[$1 "|" $2 ] "," $3 $4 }
END { for( x in a ) print x a[x]}' input |
sed 's/,/|/' # Trim leading comma
这将错误地删除前 2 列中的任何一个中的第一个逗号,而不是在输出的第 3 列中错误插入的前导逗号,并且对前 2 列而不是第 2 列进行排序。此外,输出的顺序将不同于输入。可能还有其他问题,但这可能会有所帮助。
这是 Perl 的尝试:
perl -F'\s+\|\s+' -alne '
$a{$F[1]} .= "$F[2] $F[3],";
END {
$_ = "A | $_ | $a{$_}", s/,$//, print for sort keys %a;
}' FILE
awk '
BEGIN { FS = " \\| "; OFS = SUBSEP = " | " }
{
val[$1,$2] = val[$1,$2] sep[$1,$2] $3 " " $4
sep[$1,$2] = ","
}
END { for (key in val) print key, val[key] }
'
这可能不会保留输入的顺序。此外,它使用第一列和第二列作为键,但正如你所说的第一列没有改变它是无关紧要的。