如何根据列(包括标题)拆分文件并重命名生成的文件?

Ger*_*alt 7 awk text-processing

我有一个.txt可以这样举例:

NAME | CODE
name1 | 001
name2 | 001
name3 | 002
name4 | 003
name5 | 003
name6 | 003
Run Code Online (Sandbox Code Playgroud)

我需要编写一个脚本来根据CODE列拆分这个文件,所以在这种情况下我会得到这个:

file 1:
NAME | CODE
name1 | 001
name2 | 001

file 2:
NAME | CODE
name3 | 002

file 3:
NAME | CODE
name4 | 003
name5 | 003
name6 | 003
Run Code Online (Sandbox Code Playgroud)

根据一些研究,使用 awk 会起作用:

$ awk -F, '{print > $2".txt"}' inputfile
Run Code Online (Sandbox Code Playgroud)

问题是,我还需要将标题包含在第一行中,并且我需要不同的文件名。相反的001.txt,例如,我需要类似的文件名FILE_$FILENAME_IDK.txt

don*_*sti 8

你可以这样尝试:

awk 'NR==1{h=$0; next}
!seen[$3]++{f="FILE_"FILENAME"_"$3".txt";print h > f} 
{print >> f}' infile
Run Code Online (Sandbox Code Playgroud)

上面将标题保存在一个变量h( NR==1{h=$0; next}) 中,然后,如果$3没有看到(!seen[$3]++即,如果它是第一次遇到 的当前值$3),它会设置文件名f=...)并将标题写入文件名( print h > f)。然后将整行附加到文件名( print >> f)。它使用默认值FS(字段分隔符):空白。如果你想使用|as FS(甚至是正则表达式gnu awk),请参阅下面的cas评论。

  • 知道了。`awk -F' \\| ' 'NR==1{h=$0; next} !seen[$2]++{f="FILE_"FILENAME"_"$2".txt";print h > f} {print >> f}'` 感谢 http://stackoverflow.com/questions/ 25867060/awk-warning-escape-sequence-treat-as-plain (2认同)