将基于列差异的文本拆分为多个文件

时间:2017-07-10 21:26:52

标签: sorting awk sed cut

我有关于轨迹信息的数据,如下:

EP, 13, 2017071012, 03, AP01, 126, 27.1, -130, 17, 1018, XX, 34, NEQ, 0000, 0000, 0000, 0000
AL, 07, 2017071012, 03, AP01, 132, 27, -131.1, 18, 1018, XX, 34, NEQ, 0000, 0000, 0000, 0000
WP, 19, 2017071012, 03, AP01, 000, 18.5, -116.8, 56, 982, XX, 50, NEQ, 0057, 0047, 0034, 0036
AL, 08, 2017071012, 03, AP01, 132, 27, -132.1, 17, 1018, XX, 34, NEQ, 0000, 0000, 0000, 0000

信息需要按第一(名称)和第二(数字标识符)列进行排序。

运行

sort -k1,2 file.txt

将文件整理成:

AL, 07, 2017071012, 03, AP01, 132, 27, -131.1, 18, 1018, XX, 34, NEQ, 0000, 0000, 0000, 0000
AL, 08, 2017071012, 03, AP01, 132, 27, -132.1, 17, 1018, XX, 34, NEQ, 0000, 0000, 0000, 0000
EP, 13, 2017071012, 03, AP01, 126, 27.1, -130, 17, 1018, XX, 34, NEQ, 0000, 0000, 0000, 0000
WP, 19, 2017071012, 03, AP01, 000, 18.5, -116.8, 56, 982, XX, 50, NEQ, 0057, 0047, 0034, 0036

这是实现目标的一步。

我需要根据第二列将数据分成单独的文件 - 如何做?我想像是需要某种类型的正则表达式。此外,第二列始终是数字,并且不包含负整数。

(第一列将始终以AL,EP或WP开头)

提前感谢您提供的信息和帮助!

2 个答案:

答案 0 :(得分:1)

Perl救援:

perl -aF'/,\s/' -ne 'open my $OUT, ">>", $F[1] or die $!;
                     print {$OUT} $_;' -- sorted-file
  • -n逐行读取输入行
  • -aF拆分给定模式/,\s/上的每一行,即逗号+空格,并使用结果填充@F数组
  • >>表示文件已打开以追加

答案 1 :(得分:1)

sort -k1,2 file.txt | awk -F', *' '{f="out" $2; print >> f; close(f)}'

如果您没有使用GNU awk,并且您的文件有很多独特的“$ 2”值,那么您需要随时关闭文件,例如:最简单的:

{{1}}