2012-04-11 40 views
0

输入文本文件合并文本列的文件

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 

在单行合并相关第2列

+1

和你的问题是? – pavel 2012-04-11 11:44:55

+0

我想要的输出如上所示。 – Debaditya 2012-04-11 11:47:20

+2

你在样本输入中如何处理“B | 1 | aaa | 111”?它是否与“A | 1”行合并? “相关”是什么意思?你打印复制文本的多个副本吗?提供有限的样本不能提供足够的细节。 – 2012-04-11 11:47:38

回答

2

这里是一个Perl的尝试:

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

它不工作。它只是打印,,,,,,, – Debaditya 2012-04-11 12:40:19

+0

刚刚检查 - 它从您的示例输入提供您的示例输出。 – yazu 2012-04-11 12:44:11

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 

这将删除不正确无论是在第一两列,而不是在输出的第三列的正确插入逗号领先的第一个逗号,和排序两个第一两列,而不只是第二。此外,输出的顺序将与输入不同。可能还有其他问题,但这可能有帮助。

+0

我需要由第二列进行分组。并打印第3和第4栏。如上所示。 – Debaditya 2012-04-11 12:43:58

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

这可能会不保留输入的顺序。此外,它同时使用第一列和第二列作为关键字,但正如你所说的第一列不会改变它是无关紧要的。