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

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

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

NAME | CODE
name1 | 001
name2 | 001
name3 | 002
name4 | 003
name5 | 003
name6 | 003

我需要编写一个脚本来根据列拆分此文件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

根据一些研究,使用 awk 可以:

$ awk -F, '{print > $2".txt"}' inputfile

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

答案1

你可以这样尝试:

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

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

答案2

我打赌有人会想出一句俏皮话,但我必须写一个剧本:

in='inputfile'
header=$(head -n1 "$in")
codes=($(sed -n 's/.*| \([0-9]\+\)/\1/p' "$in" | uniq ))
for line in "${codes[@]}"; do
    out="file_$i.txt"
    echo "$header" > "$out"
    grep "|.* $line$" "$in" >> "$out"
done

相关内容