【问题标题】:Merging of columns in text file合并文本文件中的列
【发布时间】:2012-04-23 17:09:34
【问题描述】:

文本文件的输入

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

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

【问题讨论】:

  • 我想要如上图所示的输出。
  • 你如何处理示例输入中的“B | 1 | aaa | 111”?它是否与“A | 1”行合并? “相关”是什么意思?您是否打印多份重复文本?提供有限的样本并不能提供足够的细节。
  • 第一列保持不变(常数)。合并仅取决于第二列。

标签: perl shell unix scripting


【解决方案1】:

您的问题没有很好地说明,但这是解决问题的一步:

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 列进行排序。此外,输出的顺序将不同于输入。可能还有其他问题,但这可能会有所帮助。

【讨论】:

  • 我需要按第二列分组。并打印第 3 nd 4th col。如上图。
【解决方案2】:

这是一个 Perl 尝试:

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

【讨论】:

  • 刚刚检查过 - 它从您的示例输入中提供了您的示例输出。
【解决方案3】:
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] }
'

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多