Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
awk使用文件中的日期将固定宽度的文件拆分为不同的文件,并保留标题_Awk - Fatal编程技术网

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

awk使用文件中的日期将固定宽度的文件拆分为不同的文件,并保留标题,awk,Awk,我有一个awk命令,它根据文件中的日期分割文件。但它不保留标题。如何保留标题并放置.txt扩展名?多谢各位 以下是一些示例行: 页眉0000000000001901160000000000ea 000000000000000产品1(EA)0000000000002001160000000000 EA 000000000000000产品2(EA)0000000000002101160000000000 EA 000000000000000产品3 下面是我正在使用的命令: "{fn=substr($

我有一个awk命令,它根据文件中的日期分割文件。但它不保留标题。如何保留标题并放置.txt扩展名?多谢各位

以下是一些示例行:

页眉0000000000001901160000000000ea
000000000000000产品1(EA)0000000000002001160000000000 EA
000000000000000产品2(EA)0000000000002101160000000000 EA
000000000000000产品3

下面是我正在使用的命令:

"{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     
预期产出:

文件1

filename: 160119.txt  
inside file:   
HEADER  
00000000000019011600000 0000000EA 000000000000000PRODUCT1 (EA)
文件2

filename: 160120.txt  
inside the file:  
HEADER  
00000000000020011600000    0000000EA   000000000000000PRODUCT2 (EA)

您可以这样做:

$ 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 'NR == 1 { header = $0 } NR > 1 { fn=substr($0,13,6); print header"\n" $0 > (fn".txt") }' input.txt

如果您为您的示例运行它,它将输出您想要的。

这将为NR>1Hi Klaus的每一行打印var标题,感谢您的响应。我收到一个错误“反斜杠不是行上的最后一个字符”。我已尝试更改为“”,但改为获取无效字符。知道为什么吗?谢谢。这将读取第一行并将其保存到变量“header”中。对于所有其他行,它将保存要“fn”的子字符串,并将标题与整行一起输出到名为“fn”.txt的文件中。我认为您正在使用windows,然后尝试将标题“\n”$0替换为标题ORS$0。它会在每行后面打印标题,而不仅仅是在顶部。我压缩了样本数据,但每个日期超过1行。请
关闭(f)
,同时避免
打开太多文件
错误,
打印$0>>f;关闭(f)嗨,马克-我试了一下你的一行,但出现了“反斜杠不是最后一个字符”的错误。我在windows中运行这个。嗨,Marc,我删除了“%s.txt”部分,它工作了,但显然没有.txt扩展名。我可以用什么来代替它?我尝试替换单引号('),但也不起作用。我也可以重命名文件,但试图消除手动干预。添加了windows oneliner来回答。嗨,Marc-windows版本不起作用。我在f=sprintf之后的双引号中得到了未终止的字符串。
awk 'NR == 1 { header = $0 } NR > 1 { fn=substr($0,13,6); print header"\n" $0 > (fn".txt") }' input.txt