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
(または最後の行と最後の印刷) am
2行目に(末尾の負の!
アドレスパターン)が含まれていない場合は、\n.*am
改行文字を空白に置き換えます。- この交換が行われたら、必要に応じて最初に繰り返して別の行を追加します(表示への条件付き
ta
ジャンプです:a
)。 - 2行目に
am
(代替なし)が含まれている場合は、1P;D
行目を印刷して2行目から始めます.
わかりました。あなたはLinuxを使用しているようです。 GNUではsed
簡単に書くことができます。
sed ':a;N;/\n.*am/!s/\n/ /;ta;P;D'