列区切り文字を含むすべての行をUnixの単一行に結合します。

列区切り文字を含むすべての行をUnixの単一行に結合します。

私のUnix出力は

ABC : 123
DEFG : 4587
MJk : 36

次の同じ区​​切り文字を使用して、すべての行を単一の行にマージしたいと思います。

ABC DEFG MJK : 123 4587 36

私は単一の列に出力を印刷するためにawkを使用することを知っています。

awk'{print $1}' | tr '\n' ' ' 

しかし印刷中

ABC DEFG MJK 

値ではない 123 4587 36

ベストアンサー1

$ awk -F: '{a=a $1; b=b $2} END{print a FS b}' file
ABC DEFG MJk : 123 4587 36

tr '\n' ' '最近、人々は改行文字を別のものに変換するために同様の方法を使用する多くの投稿を見ました。 POSIXテキストファイル(すべてのPOSIXテキスト処理ツールで読み取ることができます)を他のYMMV形式のファイルに変換するので、まれな場合を除いてこれを行わないでください。 POSIX テキスト行は で終わり\n、 POSIX txt ファイルは POSIX テキスト行で構成されます。trあるいは、他の方法を使用してすべての改行を削除すると、後続のPOSIXテキスト処理ツール(awk、sedなど)はそれを入力として使用して未定義の動作を実行できます。

以下は予期しませんでしたが、実際にPOSIXで定義されている他の動作のいくつかの例です。この複数行の文字列をスペースで区切られた単一行に変換するとします。

$ printf 'foo\nbar\n' | wc -l
       2

trすべてを削除するには\n

$ printf 'foo\nbar\n' | tr '\n' ' '
foo bar $
$ printf 'foo\nbar\n' | tr '\n' ' ' | wc -l
       0

POSIXテキストファイルと同じように出力するより良いアプローチと比較して、次にパイプするときのより直感的な結果を提供しますwc

$ printf 'foo\nbar\n' | paste -sd ' ' -
foo bar
$ printf 'foo\nbar\n' | paste -sd ' ' - | wc -l
       1

おすすめ記事