行列を単一行データに変更

行列を単一行データに変更

.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

関連情報