2012-05-09 17 views
2

私は2組のテキストファイルを持っています。最初のセットはAAフォルダにあります。 2番目のセットはBBフォルダーにあります。最初のセット(AAフォルダー)のff.txtファイルの内容を以下に示します。bashを使ってテキストファイルから行を削除する

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 
+0

62と63だけが60より大きいので、出力は3,4ではないでしょうか? – Mithrandir

+0

はいあなたは正しいです – rebca

+0

出力をフィルタリングするためにawkを使用します...それを考えましたか? – Mithrandir

答えて

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 

、第二の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 

私はそれをテストしませんでしたo問題があればコメントしてください。

+0

素晴らしい完璧に働いた。ありがとうございました。 – rebca

+0

あなたのコードは1つのファイルに対して完全に機能しました。しかし、複数のファイルの場合、このようなエラーが発生します。 "mv:target' BB/hh.txt 'はディレクトリではありません。複数のファイルで実行するコードを変更する方法は? – rebca

+0

複数のファイルに対して実行したコマンドを書いてください。 –

1
awk 'FNR == NR && $3 > 60 {array[$2] = 1; next} {if ($2 in array) next; print}' AA/ff.txt BB/filename 
関連する問題