.txtファイルには複数の行列があり、各行列は1行になければなりません。たとえば、
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
これは、予約済みスペースに空でない行を蓄積し、最後の行でない場合は削除します。それ以外の場合は、バッファを置き換え、先行改行を削除し、すべての改行を空白に変換します。
複数の空行でブロックを分離し、1 つに縮小します。
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