我有这个awk命令根据文件中的日期拆分文件。但它没有保留标题。如何保留标题并放置.txt扩展名?谢谢。
以下是一些示例行:
HEADER 00000000000019011600000 0000000EA
000000000000000PRODUCT1(EA)00000000000020011600000 0000000EA
000000000000000PRODUCT2(EA)00000000000021011600000 0000000EA
000000000000000PRODUCT3
这是我正在使用的命令:
"{fn=substr($0,13,6);print > substr($0,17,2) substr($0,15,2) substr($0,13,2) }" D:\myfiletosplit.txt
当前输出:
档案1
filename: 160119
inside the file: 00000000000019011600000 0000000EA 000000000000000PRODUCT1 (EA)
文件2
filename: 160120
inside the file:00000000000020011600000 0000000EA 000000000000000PRODUCT2 (EA)
文件3
filename: 160121
inside the file: 00000000000021011600000 0000000EA 000000000000000PRODUCT3
预期产出:
file1
filename: 160119.txt
inside file:
HEADER
00000000000019011600000 0000000EA 000000000000000PRODUCT1 (EA)
文件2
filename: 160120.txt
inside the file:
HEADER
00000000000020011600000 0000000EA 000000000000000PRODUCT2 (EA)
答案 0 :(得分:1)
您可以这样做:
$ cat tst.awk
/^[^0-9]/ {h=$0; next} # save header in var h
{ f=gensub(/(.{2})(.{2})(.{2})/,"\\3\\2\\1.txt","g",substr($0,13,6))
# save filename in f
if (!a[f]++) print h > f; # if not seen f, print header to f
print $0 >> f; # print line to file f
close(f)
}
请使用以下方式调用:
awk -f tst.awk input.txt
或使用oneliner:
awk '/^[^0-9]/ {h=$0; next} { f=gensub(/(.{2})(.{2})(.{2})/, "\\3\\2\\1.txt","g",substr($0,13,6));if (!a[f]++) print h > f;print $0 >> f;close(f)}' input.txt
和我们的Windows用户(逃避恐怖):
awk "/^[^0-9]/ {h=$0; next} { f=gensub(/(..)(..)(..)/,\"C:\\\\Users\\\\Marc\\\\Documents\\\\\\3\\2\\1.txt\",\"g\",substr($0,13,6));if (!a[f]++) print h > f;print $0 >> f;close(f)}" C:\Users\Marc\Documents\input.txt
答案 1 :(得分:1)
假设标题位于第一行,您可以阅读第一行,然后分别阅读其余内容。
awk 'NR == 1 { header = $0 } NR > 1 { fn=substr($0,13,6); print header"\n" $0 > (fn".txt") }' input.txt
如果你为你的例子运行它,它将输出你想要的。