我的 .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