我有一个.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