10

2 つの異なるテキスト ファイルで内部結合を実行しようとしています。基本的に、GNU join プログラムに相当する内部結合を探しています。そのようなものは存在しますか?そうでない場合は、awkまたはsedソリューションが最も役立ちますが、私の最初の選択肢は Linux コマンドです。

これが私がやろうとしていることの例です

ファイル 1:

0|Alien Registration Card LUA|Checklist Update
1|Alien Registration Card LUA|Document App Plan
2|Alien Registration Card LUA|SA Application Nbr
3|Alien Registration Card LUA|tmp_preapp-DOB
0|App - CSCE Certificate LUA|Admit Type
1|App - CSCE Certificate LUA|Alias 1
2|App - CSCE Certificate LUA|Alias 2
3|App - CSCE Certificate LUA|Alias 3
4|App - CSCE Certificate LUA|Alias 4

ファイル 2:

Alien Registration Card LUA

結果:

0|Alien Registration Card LUA|Checklist Update
1|Alien Registration Card LUA|Document App Plan
2|Alien Registration Card LUA|SA Application Nbr
3|Alien Registration Card LUA|tmp_preapp-DOB
4

5 に答える 5

10

ここに awk オプションがあるので、bash への依存を避けることができます (移植性のため):

$ awk -F'|' 'NR==FNR{check[$0];next} $2 in check' file2 file1

これはどのように作動しますか?

  • -F'|'-- フィールドセパレータを設定します
  • 'NR==FNR{check[$0];next}-- 合計レコード数がファイル レコード数と一致する場合 (つまり、提供された最初のファイルを読み取っている場合)、配列に値を入力して続行します。
  • $2 in check-- 作成した配列に 2 番目のフィールドが記載されている場合は、その行を出力します (アクションが指定されていない場合のデフォルトのアクションです)。
  • file2 file1 - ファイル。構造上、順序が重要NR==FNRです。
于 2012-11-07T16:01:48.523 に答える
8

あなただけが必要なようです

grep -F -f file2 file1
于 2012-11-07T21:42:47.843 に答える
8

最後に file2 を含めるべきLUAではありませんか?

はいの場合、引き続き使用できますjoin

join -t'|' -12 <(sort -t'|' -k2 file1) file2
于 2012-11-07T15:34:59.100 に答える
4

このスクリプトは次のように変更できます。

cat file2 | while read line; do
    grep $line file1 # or whatever you want to do with the $line variable
done

whileループはfile2を1行ずつ読み取り、file1のその行をgrepするgrepコマンドにその行を渡します。grepオプションで削除される可能性のある余分な出力がいくつかあります。

于 2012-11-07T15:36:14.303 に答える
1

貼り付けコマンドを使用してファイルを結合できます。

paste [option] source files [>destination file]

あなたの例では、それは

paste file1.txt file2.txt >result.txt
于 2012-11-07T15:35:02.603 に答える