合并文本文件中的列

时间:2012-04-11 11:42:52

标签: perl shell unix scripting

输入文本文件

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

在一行中合并与第二列相关的值

3 个答案:

答案 0 :(得分:2)

您的问题没有明确说明,但这是迈向解决方案的一步:

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

这将错误地删除前两列中任何一列中的第一个逗号而不是输出的第3列中错误插入的前导逗号,并对前两列而不是第二列进行排序。此外,输出的顺序将与输入不同。可能还有其他问题,但这可能会有所帮助。

答案 1 :(得分:2)

这是Perl的尝试:

perl -F'\s+\|\s+' -alne '
$a{$F[1]} .= "$F[2] $F[3],";
END {
  $_ = "A | $_ | $a{$_}", s/,$//, print for sort keys %a;
}' FILE

答案 2 :(得分:0)

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] }
'

这可能不会保留输入的顺序。此外,它使用第1列和第2列作为键,但正如您所说,第1列不会更改它是无关紧要的。