2

それぞれ 1 つの列と n 個の行を持つ 2 つのファイルを比較しています。

ファイル 1

ヴィンシー・アレックス

ロビン

ファイル 2

アレン
・アレックス・
アーロン
ラルフ・
ロビン

ファイル 1 のデータがファイル 2 に存在する場合は、タブ区切りファイルで 1 または 0 を返す必要があります。

このようなもの

ヴィンシー 0 アレックス
1
ロビン 1

私がしていることは

#!/bin/bash
for i in `cat file1 `
do
cat file2 | awk '{ if ($1=="'$i'") print 1 ; else print 0 }'>>binary
done

上記のコードでは、探している出力が得られません。

親切に見て、修正を提案してください。

ありがとうございました

4

6 に答える 6

2

シンプルな awk ソリューション:

awk 'NR==FNR{ seen[$0]=1 } NR!=FNR{ print $0 " " seen[$0] + 0}' file2 file1

簡単な説明: file2 の行については、NR==FNR であるため、最初のアクションが実行され、行が表示されたことを記録するだけです。file1 では、2 番目のアクションが実行され、その行が出力され、その行が file2 で見られたかどうかに応じて、スペースが続き、その後に「0」または「1」が続きます。

于 2012-05-25T13:47:04.370 に答える
2

AWKはこのようなことをするのが大好きです。

awk 'FNR == NR {a[tolower($1)]; next} {f = 0; if (tolower($1) in a) {f = 1}; print $1, f}' file2 file1

引数リスト内の file2 と file1 の位置を交換して、file2 の代わりに file1 を辞書にします。

FNR(現在のファイルのレコード番号) と(これまでのすべてのレコードのレコード番号) が等しい場合NR、最初のファイルが処理されます。配列要素を参照するだけで、それが存在します。これにより辞書が設定されます。命令は次のnextレコードを読み取ります。

とが等しくない場合FNRNR後続のファイルが処理され、それらのデータがディクショナリ配列で検索されます。

于 2012-05-25T13:47:11.733 に答える
1

Pythonがインストールされている場合の別の解決策。Python に精通していて、このソリューションに興味がある場合は、少しフォーマットするだけで済みます。

#/bin/python
f1 = open('file1').readlines()
f2 = open('file2').readlines()
f1_in_f2 = [int(x in f2) for x in f1]
for n,c in zip(f1, f1_in_f2):
    print n,c
于 2012-05-25T13:30:13.403 に答える
1

この種の比較を行うためのcommコマンドが存在します。

次のアプローチは、1 つのパスのみを実行し、非常に大きな入力リストにうまくスケーリングします。

#!/bin/bash
while read; do
        if [[ $REPLY = $'\t'* ]] ; then
                printf "%s\t0\n" "${REPLY#?}"
        else
                printf "%s\t1\n" "${REPLY}"
        fi
done < <(comm -2 <(tr '[A-Z]' '[a-z]' <file1 | sort) <(tr '[A-Z]' '[a-z]' <file2 | sort))

直接的であるBashFAQ #36も参照してください。

于 2012-05-25T13:06:27.907 に答える
1

いくつかのまともなアプローチがあります。行ごとの set mathを単純に使用できます。

{
    grep -xF -f file1 file2 | sed $'s/$/\t1/'
    grep -vxF -f file1 file2 | sed $'s/$/\t0/'
} > somefile.txt

別のアプローチは、単にファイルを結合して uniq -c を使用し、数値列を awk のようなものと交換することです。

sort file1 file2 | uniq -c | awk '{ print $2"\t"$1 }'
于 2012-05-25T13:09:04.457 に答える
1

次のコードでそれを行う必要があります。

BEGINとのENDセクションをよく見てください。

#!/bin/bash
rm -f binary
for i in $(cat file1); do
     awk 'BEGIN {isthere=0;} { if ($1=="'$i'") isthere=1;} END { print "'$i'",isthere}' < file2 >> binary
done
于 2012-05-25T13:00:47.113 に答える