2017-04-01 6 views
0

私は基本的なレベルのUNIX理解を持っています。2つのファイルを比較するAWKコマンド、2番目のファイルに見つからない場合は最初のファイルの行、見つかった場合は2番目のファイルの行を報告してください

私は、ファイル1のすべての行を持つファイルを持つという最終的な目標を持って、2つのファイル(タブで区切られた各ファイルの2つの列)を比較するために "awk"コマンドを使用しようとしましたが、行ファイル2に見られる、Iファイルから同じ行に置換されるファイル1の行を希望2.

File 1: 
Supercontig_12.1,420 0 
Supercontig_12.1,421 0 
Supercontig_12.1,422 0 
Supercontig_12.1,423 0 
…(rows continue in numerical order) 
Supercontig_12.1,428 0 
Supercontig_12.1,429 0 
Supercontig_12.1,430 0 

File 2 (not in numerical order): 
Supercontig_12.1,422 0.6 
Supercontig_12.1,426 0.333333 
Supercontig_12.1,428 0.5 
Supercontig_12.1,429 0 

所望の出力

Output: 
Supercontig_12.1,420 0 
Supercontig_12.1,421 0 
Supercontig_12.1,422 0.6 
Supercontig_12.1,423 0.333333 
… 
Supercontig_12.1,428 0.5 
Supercontig_12.1,429 0 
Supercontig_12.1,430 0 

Iは、以下のコマンドを使用しています、しかし、それは、ファイル1の行の最後にファイル2の行を追加することです。これは "cat"のようなものですそして。

$ awk -F"\t" 'NR==FNR{a[$1]} $1 in a{print $1 "\t" $2}' file1.txt file2.txt > output.txt 

私は、配列私がやりたいものですファイル1のサイズ、作っていますが、私は、ファイルのためにその配列内の2データを選択していないよ知っています。どんな助けも大歓迎です。前もって感謝します。

アンディ

+0

file2にfile1にレコードがありませんか? file1の値は常に0ですか? –

+0

こんにちは、ウォルター、ご質問ありがとうございます。答えは、「空白」の列にデータを入力しようとしているので、file1の2番目の列は常にゼロです。いいえ、file2のレコードは常にfile1にあります。 file2にあります。 – adklocko

答えて

0

すべての行が同じ長さ(ないSupercontig_12.1,420Supercontig_12.1,4202)を持っていることができますgrepcut: あなたは

cut -f1 file2.txt 

このコマンドの出力をファイル2の最初のフィールドを取得することができますプロセス置換<(some_command)を持つファイルであるかのように使用できます。 FILE2と一緒にこれを入れて、あなたのawkと間違っている何

cat file2.txt <(grep -vf <(cut -f1 file2.txt) file1.txt) |sort 

結果を並べ替えるFILE1.TXT

grep -vf <(cut -f1 file2.txt) file1.txt 

からこれらの行を削除するには

awk -F"\t" 'NR==FNR{a[$1]} $1 in a{print $1 "\t" $2}' file1.txt file2.txt 

file1.txtの解析時に何も印刷したくない場合。 nextを使用してください。そして、$ 0保存:FILE2.TXTから$ 1はaで発見された場合、値を置き換える

awk -F"\t" 'NR==FNR{a[$1]=$0; next} $1 in a{print $1 "\t" $2}' file1.txt file2.txt 

配列の

すべてが解析され
awk -F"\t" 'NR==FNR{a[$1]=$0; next} $1 in a{a[$1]=$0}' file1.txt file2.txt 

、印刷コンテンツを(まだ印刷されません)。

awk -F"\t" 'NR==FNR{a[$1]=$0; next} $1 in a{a[$1]=$0} END { for (i in a) print a[i] } ' file1.txt file2.txt 
+0

ウォルターありがとう!あなたの提案はほぼ完全に機能しました。唯一の問題は、印刷配列の出力ファイルが数値でソートされず、グループ内でかなりランダムに表示されることです。私は "sort -n -k1"ファイルを試しましたが、カンマの後の数字は "、1"から "10"から "100"から "1000"から "1001"に増加しました...数値でソートされた列を印刷するか、ソート内で数値的に2番目のコマンドを実行するかのどちらかです。ご協力いただきありがとうございます! – adklocko

+0

私はそれを持っていると思う、ウォルター(私は私の応答を入力する前にもう少し研究をしておくべきだった)。コマンド 'sort -t "、" -k2n output_file.txt "は私がしたいことをするために働きます。それにかかわらず、あなたはきれいに細かい説明で私を助けてくれました。あなたがそれに入れてくれたすべての時間をありがとう! – adklocko

関連する問題