bash - 将文件分割成多个子文件

标签 bash awk sed grep

我正在处理的文件看起来像这样

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/

相关文章:

linux - 为什么这种微小的变化会使 bash 崩溃?

awk - 如何调用 getline "roll back"?

regex - 删除换行符 (\n) 但排除具有特定正则表达式的行?

linux - 使用 sed 或 awk 在 linux 中删除一个单词及其下一行

bash - 删除行首的空格(空格的大小不是常量)

linux - bash 没有 $(函数参数) 的参数

arrays - 使用 jq 将带有数组的 tsv 转换为 JSON

regex - 检查字符串是否与 Bash 脚本中的正则表达式匹配

linux - 在 shell 中循环多列

linux - 排序文件仅获取行最大值