我正在处理的文件看起来像这样
header
//
[25]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001);
[29]:((962:0.000580339,930:0.000580339):0.00543993);
absolute:
gthcont: 5 4 2 1 3 4 543 5 67 657 78 67 8 5645 6
01010010101010101010101010101011111100011
1111010010010101010101010111101000100000
00000000000000011001100101010010101011111
我需要将它分成四个文件。第一个文件是
[25]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001);
[29]:((962:0.000580339,930:0.000580339):0.00543993);
第二个文件必须是
5 4 2 1 3 4 543 5 67 657 78 67 8 5645 6
下一个文件必须是
01010010101010101010101010101011111100011
11110100100101010101010101111010001000001
00000000000000011001100101010010101011111
因此必须在第一个文件之前排除 header 和//,absolute: 行应该被删除,并且 gthcont: 也不应该弹出。 理想情况下,脚本将只获取文件的输入名称,并将输出命名为first_input、second_input 和third_input...
第四个文件应该包含第一个文件中括号内的数字。在这种情况下,它只会是
25
29
所以我目前的尝试是
awk.awk
BEGIN{body=0}
!body && /^\/\/$/ {body=1}
body && /^\[/ {print > "first_"FILENAME}
body && /^pos/{$1="";print > "second_"FILENAME}
body && /^[01]+/ {print > "third_"FILENAME}
body && /^\[[0-9]+\]/ {
print > "first_"FILENAME
print substr($0, 2, index($0,"]")-2) > "fourth_"FILENAME
}
但以某种方式重复了第一个文件中的行,因此它将是 [25]、[25]、[29]、[29]
最佳答案
对脚本进行一些非常小的更改会产生所需的输出:
!body && /^\/\/$/ {body=1}
body && sub(/^gthcont: */,"") {print > "second_"FILENAME}
body && /^[01]+/ {print > "third_"FILENAME}
body && /^\[[0-9]+\]/ {
print > "first_"FILENAME
print substr($0, 2, index($0,"]")-2) > "fourth_"FILENAME
}
重复问题是由于您在两个位置打印到第一个文件而引起的。
我使用 sub
删除了 gthcont:
行的第一部分(并且也更改了模式)。如果 sub
进行任何替换,则返回 true,因此您也可以将其用作测试。使用替换而不是取消设置第一个字段的优点是您还可以删除行中的前导空格。
正如评论中指出的,不需要初始化 body
,所以我也删除了 BEGIN
block 。
关于bash - 将文件分割成多个子文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30299516/