将矩阵更改为单行数据

将矩阵更改为单行数据

我的 .txt 文件中有多个矩阵,并且需要每个矩阵位于一行中。例如,
matrices.txt:

1 2 3 4
2 3 4 5
3 4 5 6

3 4 5 6
2 3 2 5
2 3 4 5
2 3 5 6
2 3 4 5
...

我想要的是modified_matrices.txt

1 2 3 4 2 3 4 5 3 4 5 6
3 4 5 6 2 3 2 5 2 3 4 5 2 3 5 6 2 3 4 5
...

文件中有大约 1000 个矩阵,它们并不都是整数 (0.8888888889888)。

答案1

可能的awk解决方案可能是:

awk 'BEGIN { RS = ""; } { $1 = $1; } 1' matrices.txt > modified_matrices.txt

答案2

在 Vi/Vim 中你可以简单地运行:

:%j

将所有线连接在一起,或者:

:%v/^$/-1j

连接由换行符分隔的所有矩阵 (Vim 中特定文本模式之间的连接线)。

如果您需要从命令行完成此操作,请尝试:

ex -s +%j +"wq modified_matrices.txt" matrices.txt

连接所有行,或者:

ex -s +'%v/^$/-1j' +'wq! modified_matrices.txt' matrices.txt

连接由换行符分隔的所有矩阵:

答案3

您可以使用一个小 bash 脚本来做到这一点:

$ cat data
1 2 3 4
2 3 4 5
3 4 5 6

3 4 5 6
2 3 2 5
2 3 4 5
2 3 5 6
2 3 4 5

$ cat foo.sh
#!/bin/bash

while read line; do
    if [[ "${line}" = "" ]]; then
        echo ""
    else
        echo -n "${line} "
    fi
done
echo ""

$ bash foo.sh < data
1 2 3 4 2 3 4 5 3 4 5 6
3 4 5 6 2 3 2 5 2 3 4 5 2 3 5 6 2 3 4 5

答案4

sed仅有的:

sed '/^$/!{H;$!d;};x;s/.//;y/\n/ /' infile > outfile

这会在保留空间中累积非空行,如果不是最后一行,则删除它们,否则它会交换缓冲区,删除前导换行符并将所有换行符转换为空格。
用任意数量的空行分隔块,将它们折叠成一个:

sed '/^$/!{         # if line isn't empty
H                   # append to hold space
$!d                 # if it's not the last line, delete it
b end               # branch to label end (this happens only if on the last line)
}
//b end             # if line is empty, branch to label end
: end               # label end
x                   # exchange pattern space w. hold space
//d                 # if pattern space is an empty line, delete it; else
s/\n//              # remove the leading \newline
s/\n/ /g            # replace all remaining \newline chars with spaces
' infile > outfile

或者,作为一句:

sed '/^$/!{H;$!d;$b end;};//b end;: end;x;//d;s/\n//;s/\n/ /g' infile > outfile

相关内容