2017-05-16 1 views
0

私は「WordNode」と「光沢語」で始まる入れ替える行のテキストファイルを持っていますが、時々「グロス・ワード」で始まる重複行があります:私は追加できるようにしたいと思い同じ単語で始まる連続する行の間に文字列を追加するにはどうすればよいですか?

​​

は、以前wordNode ...「光沢語」で始まる各重複行の行:

WordNode "a'inai" 
gloss word "repose" 
WordNode "akti" 
gloss word "running" 
WordNode "akti" 
gloss word "turned on" 
WordNode "akti" 
gloss word "active" 
WordNode "aitco" 
gloss word "Armenian" 
WordNode "aitxero" 
gloss word "ethereal" 
WordNode "aitxero" 
gloss word "ether" 

私はこの

sed -r ':a; N; /(gloss word)[^\n]*\n\1/ s/\n.*//; ta; P; D' file1.txt > file2.txt 

を試みたが、それだけで最初とDを保持します次の重複する行を削除してください。 sed awkやその他の正規表現を使ってこれを行う正しい方法は何でしょうか?

+0

あなたは私の答えでは「これでデータはまったく変わらない」とコメントしました。どういう意味ですか?あなたが与えた 'Awk'コマンドの出力が表示されていませんか? – Inian

+0

@Inianそれは奇妙に思える...でも、DOSスタイルの行末は影響を受けないだろう... OPは確かに – Sundeep

+0

を "これは全くデータを変更しない"という意味で明確にしなければならない。つまり、実行中のデータに対して変更は行われないあなたのコード。私はもう一度試したかったのですが、削除されました。私は@ suddeepの答えがあなたのものと同じだと思って、その単語を単語から始める行を削除しようとしていて、光沢のある単語で始まる行を残しています。私はこの正規表現の初心者です。多分私は間違いを犯しました。 :/幸いにも、potongの答えは私が欲しかったのとまったく同じです。皆さん、ありがとうございました! – BitTad

答えて

1

:その後、

sed '/WordNode/h;//d;x;p;x' file 

ストアホールドスペース(HS)でWordNodeを含む行と、それを削除します。他のすべての行、すなわちgloss wordを含む行については、HSにスワップし、HSを印刷してからパターン領域(PS)に戻して印刷します。

0

これは、最も簡単にスクリプトではなく、SED行われたりようにawkはされています

while IFS= read -r line; do 
    if [[ $line == WordNode* ]]; then wnl=$line; else echo $wnl; echo $line; fi 
done << file1.txt 

(これだけエコーgloss wordライン前の最後のWordNodeの行を、あなたが一緒に複数のWordNodeラインを持っていることを期待するので、もしすべてをエコーし​​たい場合は、ステートフルにするために調整する必要があります)

+1

'これはsedやawkではなくスクリプトによって最も簡単に行われます。' - いいえ、これはawkで簡潔かつ簡単なので、シェルループで行うべきではありません。[なぜシェルループからプロセスへのテキストを考慮した悪い習慣(https://unix.stackexchange。 **いくつかの**理由のために、com/questions/169716/why-is-using-shell-loop-to-process-text-consider-bad-practice) –

1

awkレスキュー!これは、(GNU SED)あなたのために働くかもしれない

$ awk '/^WordNode/{header=$0; p=0} p{print header} /^gloss word/{p=1} 1' file 

WordNode"a'inai" 
gloss word "repose" 
WordNode "akti" 
gloss word "running" 
WordNode "akti" 
gloss word "turned on" 
WordNode "akti" 
gloss word "active" 
WordNode "aitco" 
gloss word "Armenian" 
WordNode "aitxero" 
gloss word "ethereal" 
WordNode "aitxero" 
gloss word "ether" 
+1

golfed ... 'awk '/^gloss word/{print h; print}/^ WordNode/{h = $ 0} '' – Sundeep

+1

nice!おそらく '{if(h)print h ..}'がヘッダなしで始まる場合のファイルです。 – karakfa

+0

@Sundeep:OPを投稿したのは数時間前(今削除された状態)です。コメント – Inian

0
$ awk '/WordNode/{h=$0 ORS;next} {print h $0}' file 
WordNode"a'inai" 
gloss word "repose" 
WordNode "akti" 
gloss word "running" 
WordNode "akti" 
gloss word "turned on" 
WordNode "akti" 
gloss word "active" 
WordNode "aitco" 
gloss word "Armenian" 
WordNode "aitxero" 
gloss word "ethereal" 
WordNode "aitxero" 
gloss word "ether" 
関連する問題