awk如何在不同文件中分隔给定列中具有相同内容的所有行

Amá*_*lia 1 awk

我有一个大的 csv 文件 (Test.csv),如下所示:

1,2,3,A,5
1,2,3,B,5
1,2,3,E,5
1,2,3,D,5
1,2,3,Z,5
1,2,3,B,5
Run Code Online (Sandbox Code Playgroud)

我想打印第四列在不同文件中具有相同内容的行。实际上,我需要将这些具有相同内容的行加入到新的 csv 或 txt 文件中,命名为第四列内容。例如:

输出:

文件A

1,2,3,A,5
1,2,3,A,5
1,2,3,A,5
Run Code Online (Sandbox Code Playgroud)

文件B

1,2,3,B,5
1,2,3,B,5
Run Code Online (Sandbox Code Playgroud)

由于输入文件很大,我不知道第四列中有多少种不同的模式。第 4 列仅包含单词,其他列包含单词和/或数字。

由于我没有经验,我研究了类似的问题,甚至尝试了以下代码:

awk 'NR==FNR{a[$4]=NR; next} $NF in a {print > "outfile" a[$NF]}' Test.csv
Run Code Online (Sandbox Code Playgroud)

但没有任何作用。有人可以帮我吗?提前致谢。

Ed *_*ton 6

这将在每个 UNIX 机器上的任何 shell 中使用 POSIX 排序和任何 awk 有效地工作:

$ sort -t, -k4,4 test.csv |
    awk -F, '$4!=prev{close(out); out="File"$4; prev=$4} {print > out}'

$ head -n 20 File*
==> FileA <==
1,2,3,A,5

==> FileB <==
1,2,3,B,5
1,2,3,B,5

==> FileD <==
1,2,3,D,5

==> FileE <==
1,2,3,E,5

==> FileZ <==
1,2,3,Z,5
Run Code Online (Sandbox Code Playgroud)

需要注意的一些事项:

  1. 一些 awks 需要在输出重定向右侧的表达式周围放置括号,并且
  2. 如果您不关闭输出文件,某些 awks 会失败,因此一旦超过十几个输出文件,就会尝试保留太多打开的文件,并且
  3. 在所有允许的 awks 中,保留多个打开的输出文件效率非常低,并且
  4. 在所有 awks 中,逐行关闭输出文件来解决这一问题将非常低效。