web-dev-qa-db-ja.com

bash / sed / awk / etc他のすべての改行を削除します

bashコマンドはこれを出力します:

Runtime Name: vmhba2:C0:T3:L14
Group State: active
Runtime Name: vmhba3:C0:T0:L14
Group State: active unoptimized
Runtime Name: vmhba2:C0:T1:L14
Group State: active unoptimized
Runtime Name: vmhba3:C0:T3:L14
Group State: active
Runtime Name: vmhba2:C0:T2:L14
Group State: active

それを何かにパイプして、次のようにします:

Runtime Name: vmhba2:C0:T1:L14 Group State: active 
Runtime Name: vmhba3:C0:T3:L14 Group State: active unoptimized
Runtime Name: vmhba2:C0:T2:L14 Group State: active
[...]

つまり、他のすべての改行を削除します

私は試した ... |tr "\nGroup" " "しかし、すべての改行を削除し、他のいくつかの文字も食べてしまいました。ありがとう

44
carillonator

現在テストできませんが、

... | paste - - 

それをすべき

87
glenn jackman

1つの可能性は次のとおりです。

awk 'ORS=NR%2?" ":"\n"'

行番号が2で割り切れる場合は、新しい行で終わります。それ以外の場合は、スペースで終わります。

(テスト済み:CentOS 6、GNU Awk 3.1.7)

Sedの使用( 説明 を参照):

sed ':a;N;$!ba;s/\nGroup/ Group/g'

参考文献:

11
cyberx86

sedを使用する場合、ファイル全体をメモリに読み込む必要はありません。次のように1行おきにマージできます。

sed 'N;s/\n/ /' inputfile

スペースの代わりに任意の文字を使用してください。

Awkを使用する別の方法を次に示します。

awk '{printf "%s", $0; if (getline) print " " $0; else printf "\n"}' inputfile

if/elseは、ファイルに奇数の行がある場合を処理します。これがないと、奇数の最後の行が2回印刷されます。それ以外の場合は、比較のために、次のようにすることができます。

awk '{printf "%s", $0; getline; print " " $0}'

awkでこれを行う最も慣用的な方法は次のとおりです。

awk 'ORS=NR%2?FS:RS' file

それは出力します:

Runtime Name: vmhba2:C0:T3:L14 Group State: active
Runtime Name: vmhba3:C0:T0:L14 Group State: active unoptimized
Runtime Name: vmhba2:C0:T1:L14 Group State: active unoptimized
Runtime Name: vmhba3:C0:T3:L14 Group State: active
Runtime Name: vmhba2:C0:T2:L14 Group State: active

それを説明するには、組み込み変数をそれぞれ定義する必要があります。

  • RSレコードセパレータ。デフォルトは\n(改行)です。
  • ORS出力レコード区切り記号。デフォルトは\n(改行)です。
  • FSフィールド区切り記号。デフォルトは(スペース)です。
  • NRレコード数。

デフォルトのレコード区切り文字は改行なので、レコードは、デフォルトでは行です。

NR%2NR/2の係数なので、0または1になります。 0は偶数行、1は奇数行です。

var=condition?condition_if_true:condition_if_falseは三項演算子です。

まとめると、ORS=NR%2?FS:RSと言って、出力レコードセパレータを定義しています。

  • レコード数が2k + 1の形式、つまり偶数行の場合、出力レコードの区切り記号はFS、つまりスペースに設定されます。
  • レコード数が2kの形式、つまり奇数行にある場合、出力レコード区切り記号はRS、つまり新しい行に設定されます。

このようにして、奇数行はスペースで終わり、次の行と結合されます。その行の後に、新しい行が印刷されます。

詳細は Idiomatic awk をご覧ください。

3
fedorqui

これはLinuxで動作します。

... | tr "\\n" " "

これは、改行文字の空のスペースを置き換えます。 you must正常に動作するように改行文字をエスケープします。

3
Bret McMillan

Bashでは:

... | while read l1; do read l2; echo "$l1 $l2"; done
2
jfg956

Perlがオプションの場合:

Perl -pe 's/\n/ / if $. % 2 == 1' file

s/\n/ /改行をスペースに置き換えます
$.は行番号です

1
Chris Koknat