不足している単語を含むファイルに行を追加する

不足している単語を含むファイルに行を追加する

xyz.txt次の3行を含むファイルがあります。

I am ok.
I am fine.
all good.

amその行を含まない行を見つけて前の行に追加する必要があります。

与えられた例では、必要な出力は次のとおりです。

I am ok.
I am fine. all good.

そして、スクリプトは大容量ファイルでも機能するはずです。たとえば、ファイルに10行があり、3行と7行に「am」がない場合は、3行を2行に追加し、7行を6行に追加する必要があります。

答え1

アッ解決策(単語境界演算子awkにGNUまたはbusyboxが使用されていると仮定):\<\>

拡張サンプルfile

I am ok.
I am fine.
all good.
am I sleeping?
how's that
I am sure
about that
and think on.
For that I am now

awk '{ printf "%s%s",(NR==1? "": (!/\<am\>/? OFS:ORS)),$0 }END{ print "" }' file
  • "%s%s"- 2つの仕様の形式文字列です。 1つ目は、%s潜在的な項目「先行」区切り記号です。
    • 最初のレコード()の場合は(空の文字列)NR==1です。""
    • 単語を含まないレコードの場合am- OFS(出力フィールド区切り文字、つまりスペース)
    • am- という単語を含むレコードの場合ORS(基本改行文字である出力レコード区切り記号)

出力:

I am ok.
I am fine. all good.
am I sleeping? how's that
I am sure about that and think on.
For that I am now

答え2

そしてsed

sed -e ':a' -e 'N;/\n.*am/!s/\n/ /;ta' -e 'P;D'

説明する:

  • 次の行を追加するN(または最後の行と最後の印刷)
  • am2行目に(末尾の負の!アドレスパターン)が含まれていない場合は、\n.*am改行文字を空白に置き換えます。
  • この交換が行われたら、必要に応じて最初に繰り返して別の行を追加します(表示への条件付きtaジャンプです:a)。
  • 2行目にam(代替なし)が含まれている場合は、1P;D行目を印刷して2行目から始めます.

わかりました。あなたはLinuxを使用しているようです。 GNUではsed簡単に書くことができます。

sed ':a;N;/\n.*am/!s/\n/ /;ta;P;D'

関連情報