0

bash/sed/awk (便利な 1 行のスクリプト) で解決しようとしている次の問題があります。

2 つ以上のファイルを比較し、同じ名前の 2 番目のファイルには存在しない単語 (パターン) を含む 1 番目のファイルの行のみを出力し、出現順序を維持し、大文字と小文字を区別しません。(まあ、とても複雑でばかげているように聞こえます...別の言葉で言い換える方法がわかりません)。

次のような情報のリストを含む 2 つの異なるファイル (file1、file2) があります。

ファイル1

Agents In The Court / No Love For The Empire
Mercenary Armor
Solo Han WB
Obi-Wan's Journal
Obi-Wan's Lightsaber
No Questions Asked
Do, or do Not
Strike Blocked

ファイル2

Agents In The Court / No Love For The Empire BB -> (LiGHT SIDE -- Special Cards)    
Mercenary Armor BB -> (LiGHT SIDE -- Device)
Obi-Wan's Journal BB -> (LiGHT SIDE -- Device)
No Questions Asked BB -> (LiGHT SIDE -- Special Cards)
Do, Or Do Not BB -> (LiGHT SIDE -- Defensive Shield)
Strike Planning BB -> (LiGHT SIDE -- Effect)
Alter (Obi-Wan) WB -> (LiGHT SIDE -- Used Interrupt)
Solo Han BB -> (LiGHT SIDE -- Human and Human-Like Characters)
Combined Attack BB -> (LiGHT SIDE -- Lost Interrupt)

結果は次のようになります。

Solo Han WB
Obi-Wan's Lightsaber
Strike Blocked

どんな助けにも感謝します(完全な解決策、ヒント、同様の問題へのリンクなど)。

4

4 に答える 4

0

ワンライナーは存在しないと思います。おそらくいくつかの一時ファイルを操作する必要があります。考え:

# just some boilerplate for handling temp files
t=`mktemp -d -t sort.XXXXXX`
trap "rm -rf $t" EXIT

# add two columns: file-id + line and sort by 3rd field (real data)
nl -ba -nln < file1 | sed -e 's/^/1 /' | sort -k3 >$t/file1
nl -ba -nln < file2 | sed -e 's/^/1 /' | sort -k3 >$t/file2

# get unique lines, filter these from file1, sort by line and give out data
uniq -f 2 $t/file1 $t/file2 | sort -n | cut -d ' ' -f 3-

(未テスト。フィールド区切り文字に関する修正が必要な場合があります)。

上記のスクリプトは sed + gawk よりも多くのツールを必要としますが、最近の GNU システムで動作するはずです。

于 2013-11-04T23:26:33.723 に答える
0

あなたのニーズに合ったシンプルなものは、組み込みの差分です

diff file1 file2

2つのファイル間で異なるすべての行を出力します

于 2013-11-05T21:12:32.470 に答える
0

file2 が大きすぎない限り、これらのいずれも bash で機能します。

while read x; do if [[ -z "$(grep -Fi "$x" file2)" ]]; then echo "$x"; fi; done < file1

cat file1 | while read x; do if [[ -z "$(grep -Fi "$x" file2)" ]]; then echo "$x"; fi; done

全体として、file1 の各行を読み取り、file2 でその行を grep して、一致が見つからない場合にのみ行を出力します。

より詳細には、while read x; do ...; done < file1一度に 1 行ずつ file1 から変数 x に読み込みます。は file2 での"$(grep -Fi "$x" file2)"内容を含む行を検索し、$x一致するものが見つからない場合は空の文字列と評価します。-Fフラグは grep に固定文字列を検索するように指示するため、の内容を正規表現として扱いません$x。フラグは、-i検索中に大文字と小文字を区別しないことを示しています。-z文字列引数が空の場合 (つまり、grep で一致が見つからない場合)、テストは true と評価されます。

于 2013-11-05T03:00:37.193 に答える