1

file1.txt と file2.txt の 2 つのテキスト ファイルがあります。

file1.txt には番号のリストが含まれています。file2.txt にも数値のリストが含まれていますが、より多くの数値が含まれています (適切なチャンクは file1.txt の数値です)。これは私がやろうとしていることです:

file1.txt のすべての数値を file2.txt から削除し、出力を file3.txt に保存したいと考えています。したがって、file3.txt には、file1.txt の番号は含まれません。どうすればこれを達成できますか?

4

6 に答える 6

5

を使用する 1 つの方法を次に示しawkます。

awk 'FNR==NR { a[$0]; next } !($0 in a)' file1.txt file2.txt > file3.txt

これは file1 を配列に読み取り、次に file2 を反復処理するときに、配列にない file2 の行を出力し、それらを出力ファイルに書き込みます。ご不明な点がございましたら、お気軽にお問い合わせください。乾杯。

于 2013-01-29T05:24:45.040 に答える
4

GNUgrepを使用すると、' fgrep'モードを使用できます。

grep -F -v -f file1.txt -w file2.txt > file3.txt

デモ:

seq 1 30 > file2.txt
for i in 1 2 3 4 5; do echo $RANDOM; done | sed 's/\(..\).*/\1/' > file1.txt
grep -F -v -f file1.txt -w file2.txt > file3.txt

の内容はfile2.txt1から30までの数字の行です。の内容file1.txtは5つの半乱数2桁の数字です。の出力file3.txtは、ファイル1にないファイル2の行です。ループによって生成される乱数はあまり良くなく、1..30に制限されていないことに注意してください(すぐ下のコメントも参照してください)。

GNUに固有の機能は、単語全体に一致grepするフラグです。-w興味深いことに、POSIX 2008は、それ-xが正確な行と一致する必要があることを指定しており、この-xオプションは私にとっては正しく機能します(Mac OS X 10.7.5では、/usr/bin/grepGNU grep 2.5.1です)。理論的には、-xよりポータブルです。POSIX 1997標準にも含まれていたため、広く利用できるはずです。この-wオプションは、1行に複数の番号がある場合に適しています(ただし、grep行全体が削除されます)。

于 2013-01-29T04:03:21.613 に答える
1
sort file1.txt file2.txt|uniq -u > file3.txt
于 2013-01-29T02:43:11.243 に答える
1

file2.txt の一意の要素のみを出力したいとします。これは、commユーティリティが設計されているものです。

comm -13 <(sort file1.txt) <(sort file2.txt)

テスト

$ cat file1.txt
5
4
6
2
10

$ cat file2.txt
3
7
8
2
4
1
9
10
5
6

$ comm -13 <(sort file1.txt) <(sort file2.txt)
1
3
7
8
9
于 2013-01-29T07:16:33.300 に答える
1

unix の「diff」コマンドを使用して違いを取得し、不要な行を除外できます。--changed-group-formatおよび--unchanged-group-formatオプションを使用して、必要なデータをフィルタリングできます。

次の 3 つのオプションを使用して、各オプションに関連するグループを選択できます。

  • '%<' FILE1 から行を取得

  • '%>' FILE2 から行を取得

  • 両方のファイルから行を削除するための '' (空の文字列)。

例えば:

diff --changed-group-format="%>" --unchanged-group-format="" file1.txt file2.txt > file3.txt
于 2013-01-29T02:47:02.300 に答える
0

これらの数値がどのようにフォーマットされているかについて、もう少し詳しく教えていただけますか? それらのそれぞれは新しい行にありますか?それらはすべて同じ桁数ですか?

編集:コメントを受け取った後:

while read line
do
    bool="false"
    while read secLine
    do
        if [ "$line" == "$secLine" ]
        then
            bool="true"
        fi
    done <file1
    if [ "$bool" == "false" ]
    then
         echo $line >> file3.txt
    fi
done <file2

総当たりではありますが、それは機能します(または機能するはずです。構文エラーを確認してください。何も表示されませんでしたが、いくつかある可能性があります)。数値の数によっては、しばらく時間がかかる場合があります。

于 2013-01-29T02:43:00.073 に答える