awk使用其中的日期将固定宽度文件拆分为不同的文件并保留标题

时间:2017-09-19 01:01:26

标签: awk

我有这个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)

2 个答案:

答案 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

如果你为你的例子运行它,它将输出你想要的。