2

2セットのテキストファイルがあります。最初のセットはAAフォルダーにあります。2番目のセットはBBフォルダーにあります。最初のセット(AAフォルダ)のff.txtファイルの内容を以下に示します。

Name        number     marks
john            1         60
maria           2         54
samuel          3         62
ben             4         63

マークが60を超える場合は、このファイルの2番目の列(数値)を印刷したいと思います。出力は3,4になります。次に、BBフォルダー内のff.txtファイルを読み取り、番号3,4を含む行を削除します。どうすればbashでこれを行うことができますか?

BBフォルダ内のファイルは次のようになります。2列目は数字です。

   marks       1      11.824  24.015  41.220  1.00 13.65 
   marks       1      13.058  24.521  40.718  1.00 11.82
   marks       3      12.120  13.472  46.317  1.00 10.62 
   marks       4      10.343  24.731  47.771  1.00  8.18
4

2 に答える 2

1
awk 'FNR == NR && $3 > 60 {array[$2] = 1; next} {if ($2 in array) next; print}' AA/ff.txt BB/filename
于 2012-05-09T13:51:08.157 に答える
0

これは機能しますが、効率的ではありません(それは問題ですか?)

gawk 'BEGIN {getline} $3>60{print $2}' AA/ff.txt | while read number; do gawk -v number=$number '$2 != number' BB/ff.txt > /tmp/ff.txt; mv /tmp/ff.txt BB/ff.txt; done

もちろん、2番目のawkはsed-iに置き換えることができます


マルチファイルの場合:

ls -1 AA/*.txt | while read file
do
    bn=`basename $file`
    gawk 'BEGIN {getline} $3>60{print $2}' AA/$bn | while read number
    do
        gawk -v number=$number '$2 != number' BB/$bn > /tmp/$bn
        mv /tmp/$bn BB/$bn
    done
done

テストはしていませんので、問題があればコメントしてください。

于 2012-05-09T13:47:34.967 に答える