4

誰かが私がこれを回避するのを手伝ってくれることを願っています

私は2つのファイルを持っています。1つは325行の長さで、もう1つは361行の長さです。

これらのファイルの大部分は同一のコンテンツですが、2番目のファイルにはランダムな余分な行が挿入されています。私は余分な行だけに興味があり、ファイル内でそれらが出現する順序を保持する必要があります。

ファイルには約31行の繰り返し段落が含まれています。この段落の最初と最後の行を知っており、段落全体を削除しても問題はありませんが、方法を理解できません。

すなわちFile1

The quick brown
fox jumped 
over the
lazy dog
The quick brown
fox jumped
over the
lazy dog
The quick brown
fox jumped
over the
lazy dog

すなわちFile2

The quick brown
fox jumped
over the
lazy dog
sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
The quick brown
fox jumped
over the
lazy dog
djakdjhgmv
asdjkljkgfyiyi
The quick brown
fox jumped
over the
lazy dog
jghytpuptou

この順序で余分な行だけを出力する必要があります。

sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
djakdjhgmv
asdjkljkgfyiyi
jghytpuptou

助けやアドバイスをいただければ幸いです。残念ながら私は*nixの人ではありません:(いくつかのdiff式とcomm式を試しましたが、必要なものが得られません。

4

4 に答える 4

3

この魔法のコマンドを試してください:

diff file1.txt file2.txt | sed -n 's/^> \(.*\)/\1/p'

diff file1.txt file2.txt次のような出力が必要です

2c2
< fox jumped 
---
> fox jumped
4a5,7
> sadhasdgh
> qyyutrytkdaslksad
> utyiuiytiuyo
8a12,13
> djakdjhgmv
> asdjkljkgfyiyi
12a18
> jghytpuptou

sed -n 's/^> \(.*\)/\1/p'で見つめている行を見つけ>、その行を。なしで出力する必要があります>。これが機能しない理由として考えられるのは、システムでのdiffの出力が異なることです。

于 2011-12-20T17:46:59.443 に答える
1

これはうまくいくはずです-

awk 'NR==FNR{a[$0]++;next} !($0 in a){print $0}' file1 file2

説明:

NRFNRですawk's built-in variables。レコードの数を登録し、 2 つのファイルを操作するときNRにリセットされません。に似ていますが、ファイルが完全に解析された後にリセットされます。0FNRNR0

このawkワンライナーでは、ファイル 1 に対してのみNR==FNRアクションを強制するという条件を維持します (これは、 を使用するまでのみ真になります)。このアクションは、各行を. が呼び出されないように追加されます。これが になると、は呼び出されません。(ie )に関しての内容をチェックする に移動します。の内容が にある場合は、無視します。配列にない場合は、それらの行が余分であり、.{a[$0]++;next}NR==FNRfile1arraynextsecond actionNR==FNRuntruefirst actionawksecond actionfile2arrayfile1file2arrayfile2

テスト:

ファイル1:

[jaypal:~/Temp] cat file1
The quick brown
fox jumped 
over the
lazy dog
The quick brown
fox jumped
over the
lazy dog
The quick brown
fox jumped
over the
lazy dog

ファイル 2:

[jaypal:~/Temp] cat file2
The quick brown
fox jumped
over the
lazy dog
sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
The quick brown
fox jumped
over the
lazy dog
djakdjhgmv
asdjkljkgfyiyi
The quick brown
fox jumped
over the
lazy dog
jghytpuptou

実行:

[jaypal:~/Temp] awk 'NR==FNR{a[$0]++;next} !($0 in a){print $0}' file1 file2
sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
djakdjhgmv
asdjkljkgfyiyi
jghytpuptou
于 2011-12-20T17:50:27.373 に答える
0

これはうまくいくかもしれません(GNU diff):

diff -bu file1 file2 | sed -n '1,2d;s/^+//p'
sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
djakdjhgmv
asdjkljkgfyiyi
jghytpuptou
于 2011-12-20T21:05:47.450 に答える
0
diff -b sample.log sample.log.1 | awk '/>/ {print $2}'
于 2011-12-21T21:50:12.873 に答える