複数の行を含むファイルがありますが、すべて特定のパターンと一致する場合はリンクしたいと思います。
以下を使用して、パターンに合った行を見つけて、次の行を取得できることを知っています。
grep -E -A1 'Pattern' filename
しかし、次の行もパターンと一致するかどうかを確認し、2行をどのようにリンクしますか?
たとえば、次のようなファイルがあります。
Hello
i
am
John
Smith
例示的なパターンは以下の通りである。
'^[A-Z][a-z]+'
したがって、この場合はすべて大文字で始まる行をマージしたいと思います。
私が達成したい結果は次のとおりです。
Hello
i
am
John Smith
ベストアンサー1
/^[A-Z][a-z]+/{
:a
N
/\n[A-Z][a-z]+/{
s/\n/ /
b a
}
}
別の名前で保存しjoin.sed
て実行してくださいsed -Ef join.sed file
。
行がパターンと一致する場合は、パターン空間に次の行を追加し、行もパターンに一致する限り、改行を空白に置き換えるループを開始します。
GNU Sedの場合は、1行に縮小できます。
sed -E '/^[A-Z][a-z]+/{:a;N;/\n[A-Z][a-z]+/{s/\n/ /;b a}}' file
join.awk
または、パターンが次のようになる必要があるAwkスクリプトp
:
{
if($0~p)c+=1
else c=0
printf "%s%s", (c>1 ? " " : ors), $0
ors=ORS
}
END{print ""}
実装する: awk -f join.awk p='^[A-Z][a-z]+' file
。