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


39

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" " "が、すべての改行を削除し、他のいくつかの文字も使い果たしました。ありがとう


2
tr完全に文字ベースです:trに改行とすべての「G」、「r」、「o」、「u」、「p」を削除するように要求しました。
グレンジャックマン

回答:


80

今はテストできませんが、

... | paste - - 

それをする必要があります


5
+1-機能し、エレガントです。(行の間にタブを配置します- paste -d ' ' - -必要に応じてスペースを追加します)
cyberx86

4
コマンドの仕組みを教えてください。なぜ2つあるの-?ありがとう
-bbaja42

7
pasteファイルの対応する行を連結するために使用されます:paste file1 file2 file3 ...。「ファイル」引数の1つが「-」の場合、行は標準入力から読み取られます。2つの「-」引数がある場合、貼り付けはstdinから2行かかります。等々。マニュアルページを参照してください
グレンジャックマン

10

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

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

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

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

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

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

参考文献:


8

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

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}'

1
後半コメント:1)文字列は「」に$ 0に設定、最後の行を重複を避けるためにパーセント記号、2)を有している場合には常に、printfのためのフォーマット指定子を使用する-awk '{printf "%s", $0; $0=""; getline; print " " $0}'
グレンはジャックマン

3

最も慣用的な方法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%2はのモジュラスでNR/2あるため、0またはのいずれかになります10偶数行と1奇数行の場合。

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

まとめて、ORS=NR%2?FS:RS出力レコードの区切りを定義していると言います。

  • レコードの数がフォームにある場合2k + 1、つまり偶数行にある場合、出力レコードの区切り文字はFS、つまりスペースに設定されます。
  • レコードの数がフォーム上にある場合2k、出力レコードセパレータに設定され、すなわち、奇数ライン上に、その後されRS、それは、新しい行です。

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

詳細については、慣用句awkを参照してください。


2

これはLinux上で私のために働く:

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

これは、改行文字の空のスペースを置き換えます。正しく機能するためには、改行文字をエスケープする必要があります。


これにより、他のすべての改行ではなく、すべての改行が削除されます。
トレントン

2

bashの場合:

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

1

Perlがオプションの場合:

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

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.