1

3 つのファイルがあり、awk を使用して最初の 2 つを比較し、最後のファイルを frist ファイルと一致しない名前で更新したいと考えています。

ファイル 1: ignore.txt

bob
diana

ファイル 2: list.txt

alice
bob
chris
diana
elvis

ファイル 3: names.txt

alice
chris
elvis

ファイル 2 には新しい名前が少しずつ追加されるので、それを他の両方のファイルと比較し、そのリストにある新しい名前を names.txt に追加できる必要があります。

getlineこれはこれまでの私のスクリプトで、リストと無視の比較は機能していますが、新しい配列を使用してメモリ内のファイルと比較する方法をまだ正しく理解していないため、更新は行われません。

私はスクリプトを次のように呼び出しています:awk -f compare ignore.txt list.txtそしてそれは動作します。追加の変数で呼び出すと、それは実行されません: awk -f compare -v newnames=1 ignore.txt list.txt.

 BEGIN {
  file="list.txt"
  tmpfile="new_list.txt"
  }
# working
FNR == NR { names[$0]++; next }
!names[$0] {
   print > names.txt
}
{ #not working
if (newnames == 1) {
  mvcmd="mv " tmpfile file;
    while ((getline newnames < file) > 0)
      newnames[$0]++; next
     !newnames[$0];
        print > tmpfile 
     system(mvcmd)
     close(dbfile)
  }

どうすればそれを機能させることができますか?混乱を招くので、コードはあまり良くありません。ごめん。

4

3 に答える 3

3

問題をどのように説明するかを考えると、これが必要です。

awk 'FILENAME!=ARGV[3]{seen[$0]++;next} !seen[$0]++' file1 file3 file2

出力で file3 を更新するには、次のようにします。

awk 'FILENAME!=ARGV[3]{seen[$0]++;next} !seen[$0]++' file1 file3 file2 >> file3

file2 から重複した新しい名前も削除されます。

$ cat file1
bob
diana

$ cat file2
alice
bill
bob
chris
ted
diana
elvis
ted

$ cat file3
alice
chris
elvis

$ awk 'FILENAME!=ARGV[3]{seen[$0]++;next} !seen[$0]++' file1 file3 file2
bill
ted

file3 のすべての値が file2 にも存在するが、file2 で重複している可能性がある場合は、これだけで十分です。

awk 'NR==FNR{seen[$0]++;next} !seen[$0]++' file1 file2 > file3

file3 のすべての値が file2 にも存在し、file2 での重複が不可能な場合、@sudo_O のソリューションは問題なく機能します。

于 2013-09-10T12:33:47.310 に答える