2016-12-17 11 views
-2

ソースはテキストファイルです。 KEYで始まる行があります。その場合、目的はその行がその行の前の行と結合されていることです。 KEYが存在しない場合もあります。その場合、行は変更なしで出力に転送されます。一致しない文字列または「行対」のいずれにもパターンはありません。それぞれが個別に、または2行以上のグループで発生する可能性があります。bashは2行目の先頭でKEYと行を結合します

1234 abc 
abcdef 
abcdef1 
KEY xyx 
any arbitrary string not starting with KEY 
def 987 

目的が変更されていない基準を満たさない行を残しながら、一行に「ラインペア」を組み合わせることである:入力テキストファイルの

例。

所望の出力

1234 abc 
abcdef 
abcdef1KEY xyx 
any arbitrary string not starting with KEY 
def 987 

キーは「線対」の最初の行にある解決策があります。好ましい解決策は、sed、perl、awkの順である。しかし、より高い優先度が解決策です!

+5

説明は、より多くの情報を提供するために、より良い...複雑に聞こえます。文字列を実際のデータに置き換え、可能な出力を助言する。解決策は、 'grep -A 2" KEY "file' - キーを見つけて次の2行を得るという単純なものです。しかし、それはあなたが欲しいものは簡単ですか?私はそうは思わない。より良い説明を与える。 –

+0

2行目がKEYで始まるときに2行を結合したいと思うと思います。 –

+0

@WalterAこのような場合、彼は 'grep -B 1" KEY "file'を意味しますか? –

答えて

2

sedは個々の行の単純な置換であり、すべてです。したがって、これはsedでは完全に不適切な作業になります。

これはperlのような非標準のツールをインストールする必要はありませんし、すべてのUNIXのインストールで動作します:

$ awk '{printf "%s%s", (/^KEY/ ? OFS : ors), $0; ors=ORS} END{print ""}' file 
... 
string 
string KEY string 
string 
... 
0

このようなもの(awkスクリプト)?

BEGIN {previous=""} 
/^[[:alnum:]]+$/ {if (previous) {print previous} previous=$0} 
// {print previous, $0; previous=""} 
END {if (previous) {print previous}} 

私は、(a)はKEYとラインが常にKEYおよび(b)のキーを持つ行が、その中に空白文字を持つ行があることなく、少なくとも1行が先行していることを、ここで想定しました。

+0

私の無知を許して、条件付きKEYはどこにコードされていますか?はい、行に2つのキー行がありません。すべての行には少なくとも1つのスペース文字があります。 –

+0

実際の文字列 'KEY'であっても、後続の文字列からスペースで区切られたものであれ、KEY入力の様子はわかりませんでした。だから私はより一般的な第二を想定した。 awkスクリプト全体の編集されたバージョンの3番目のルールは、スペースを含む行をキャッチし、先行するものはKEYです。 –

関連する問題