Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/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
Bash 将文件拆分为多个子文件_Bash_Awk_Sed_Grep - Fatal编程技术网

Bash 将文件拆分为多个子文件

Bash 将文件拆分为多个子文件,bash,awk,sed,grep,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 01010010101010101010101010101011111

我正在处理的文件如下所示

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
下一个文件必须是

5 4 2 1 3 4 543 5  67 657  78 67 8  5645 6
01010010101010101010101010101011111100011
11110100100101010101010101111010001000001
00000000000000011001100101010010101011111
因此,头和//必须在第一个文件之前被排除,绝对:行应该被删除,gthcont:shoudl也不应该弹出。 理想情况下,脚本只需获取文件的输入名称,并将输出命名为第一个\u输入、第二个\u输入和第三个\u输入

第四个文件应该有第一个文件中括号内的数字。在这种情况下,它只能是

25
29
所以我现在的尝试是

啊,啊
但是它以某种方式复制了第一个文件中的行,因此它将是[25],[25],[29],[29]

我将使用一个shell函数:

function split3 {
    if [[ $# -ne 1 ]]; then echo 'split3: error: require 1 argument.' >&2; return 1; fi;
    while read -r; do
        line=$REPLY;
        if [[ "$line" =~ ^\[([0-9]+)\]: ]]; then
            echo "$line" >&3;
            echo "${BASH_REMATCH[1]}" >&6;
        elif [[ "$line" =~ ^gthcont: ]]; then
            echo "${line#gthcont: }" >&4;
        elif [[ "$line" =~ ^\s*[01]+\s*$ ]]; then
            echo "$line" >&5;
        fi;
    done <"$1" 3>"first_$1" 4>"second_$1" 5>"third_$1" 6>"fourth_$1";
};
split3 input; echo $?;
## 0
cat first_input;
## [25]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001);
## [29]:((962:0.000580339,930:0.000580339):0.00543993);
cat second_input;
## 5 4 2 1 3 4 543 5  67 657  78 67 8  5645 6
cat third_input;
## 01010010101010101010101010101011111100011
## 1111010010010101010101010111101000100000
## 00000000000000011001100101010010101011111
cat fourth_input;
## 25
## 29
函数拆分3{
如果[$#-ne 1]],则回显“拆分3:错误:需要1个参数”。>&2;返回1;fi;
读的时候;做的时候
行=$REPLY;
如果[[“$line”=~^\[([0-9]+)\]:];那么
回声“$line”>&3;
echo“${BASH_REMATCH[1]}”>&6;
elif[“$line”=~^gthcont:];然后
echo“${line#gthcont:}”>&4;
elif[“$line”=~^\s*[01]+\s*$];然后
回声“$line”>&5;
fi;
完成“第一个”4>“第二个”5>“第三个”6>“第四个”;
};
split3输入;echo$?;
## 0
第一类输入;
## [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
## 1111010010010101010101010111101000100000
## 00000000000000011001100101010010101011111
第四类输入;
## 25
## 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
块。

注意变量默认为
0
,因此您不必像设置
BEGIN{body=0}那样设置它们
。看起来您对逻辑做了正确的更改,但我不确定将代码移植到bash做了什么来帮助解决问题!这对我来说并不是第二个文件……所有其他文件都很好,但第二个文件不在那里它对您发布的测试数据有效:如果您的实际输入与regex
^gthco不匹配nt:
确切地说,第二个文件不会由此代码生成。