0

2 つのテキスト ファイルがあります。hash_only.txt と final_output.txt hash_only.txt は次のようになります。

193548
401125
401275

final_output.txt は以下のようになります。

193548      1199687744  5698758206701808640
193548      1216464960  5698758206761818112
193548      1216464960  5698758206778417152
193548      4236691520  5698758206778945280
401125      2138607488  5698762375908890880
401125       863932288  5698762375909423360
401125      3884158848  5698762375910044160
401125      2609483648  5698762375911032320

次のことを行うループを作成しようとしています。

for i in `cat hash_only.txt` ;
do
    for j in `cat final_output.txt` ;
            do
                    if [ $i -eq $j ]
                    then
                            echo $i $j      
                    fi
            done
 done;

193548,401125 などの hash_only.txt のすべての値について、列 1 が 193548,401125 などに一致するファイル 'final_output.txt' から列 2,3 を抽出し、列 2,3 を print_193548、print_401125 などに出力します。

上記のコードでは、then の部分にコードを入れる必要があります。しかし、私は bash にあまり精通していないため、それを理解できません。

編集:

my スクリプトを次のように変更しました for i in cat hash_only.txt;

do
        for j in `cat final_output.txt` ;
                do
                        if [ $i -eq $j ]
                        then
                                gawk 'FNR==NR
                                        { hash[$1]  
                                          next 
                                        }
                                       $1 in hash  { 
                                        print $2,$3 >> "print_"$1; 
                                }' hash_only.txt final_output.txt
                        fi
                done
done;

print_[0-9]* という名前のファイルは作成されません。

4

3 に答える 3

2

これを試して:

nawk 'FNR==NR{a[$0];next}($1 in a){print $2,$3>$1}' hash_only.txt  final_output.txt 

これにより、最初のフィールドとして名前を持つファイルが実際に作成され、要求された方法で出力が保存されます。

于 2012-06-14T05:40:48.030 に答える
1
awk '
FNR==NR {
    hash[$1]
    next
}
$1 in hash {
    printf("%s\t%s\n", $2, $3) > "print_"$1;
}' hash_only.txt final_output.txt

私の解決策はピーターの解決策とほとんど同じです。

于 2012-06-14T05:36:06.223 に答える