両方のファイルを比較し、最初の列を無視して行番号を印刷します。

両方のファイルを比較し、最初の列を無視して行番号を印刷します。

タブ区切りファイルの最初の列を無視して差分行番号を印刷するにはどうすればよいですか?

はい - 最初の列を無視し、行番号を印刷してファイル1とファイル2を比較します。ファイル2に存在する差分レコードの場合。

ファイル1から:

user1   fistname    Lastnamename
user2   Johnny            Depp
user3   Tom               Cruise
user4   Leonardo          DiCaprio
user5   Sylvester         Stallone

そして

ファイル2から:

user10   fistname    Lastnamename
user2   Johnny            Depp
user30  Tom'               Cruise
user4   Nicolas           Cage
user50  Sylvester         Stallone

予想される結果:- file2の違いは行番号3,4です。

比較するファイルサイズはGB単位で、ファイルはタブで区切られます。

答え1

diffコマンドとcutを使用して、2つのファイルの違いを見つけることができます。

diff <(cut -f2 -d$'\t' file1) <(cut -f2 -d$'\t' file2)

出力は次のとおりです

3,4c3,4
< Tom
< Leonardo
---
> Tom'
> Nicolas

より多くの重複レコードが気になる場合は、上記のコマンドを使用してsort -u重複レコードを削除し、他のファイルとの違いを見つけます。コマンドは次のとおりです。

diff <(cut -f2 -d$'\t' file1|sort -u) <(cut -f2 -d$'\t' file2|sort -u)

答え2

私はこのコードを試してみましたが、データが十分ではなく、これがうまくいくかどうかわかりません。

diff --unchanged-line-format="" --old-line-format="" --new-line-format=":%dn: %L" file1 file2 | sed 1d | cut -d':' -f2 |tr '\n' ','|sed 's/,$//g'

答え3

これはあなたの質問に答えることができます:

awk 'NR==FNR{++a[$2,$3];next} {line++;if(!(a[$2,$3])){print line}}' record1 record2

説明する:

FNR==NR

複数の入力ファイルがある場合、awkFNRは次のファイルの最初の行で再び1にリセットされ、NRは中断された場所から増え続けます。確認によってFNR==NR、実際に最初のファイルが現在解析されていることを確認しています。

++a[$2,$3]

最初のファイル(上記を参照)を解析する場合は、最初のフィールド$ 2と2番目のフィールド$ 3をキーとして連想配列を作成し、値を1ずつ増やします。これにより、本質的に「表示された」リストを作成できます。

next

このコマンドは awk にそれ以上のコマンドを処理せず、次のレコードを読み取り、再起動するように指示します。 file1 は連想配列の設定にのみ使用されるため、これを行います。

!(a[$2,$3])

この行は、FNR == NRがfalseの場合にのみ実行されます。つまり、file1を解析しないので、file2を解析する必要があります。次に、file2の最初のフィールド$ 1と2番目のフィールド$ 2をキーとして使用して、以前に作成した「ボーン」リストのインデックスを作成します。返された値が0の場合、file1はその値を見ることができないことを意味するので、この行を印刷する必要があります。逆に、値が0以外の場合はfile1に表示されるため、その値を印刷しないでください。 !(a[$2,$3]) は !(a[$2,$3]){print} と同じです。指定しない場合、デフォルトの動作は行全体を印刷するためです。

答え4

$ echo -n 'difference in file2 is for line number ';diff --unchanged-line-format="" --old-line-format="" --new-line-format="%dn " <(tail +2 file1|unexpand -a|cut -f2-) <(tail +2 file2|unexpand -a|cut -f2-)|grep -o "[0-9]*" | while read i;do echo $((i+1));done|paste -sd,
difference in file2 is for line number 3,4

関連情報