2017-01-20 6 views
1

awkの条件が満たされている場合、マスターファイル(bar)に貼り付けたいファイルのリストがあります。条件付きでbash ifとawkループでファイルを貼り付けます

for foo in *; 
do 
    if awk '*condition* {exit 1}' $foo 
    then        
    :       
    else 
    paste $foo > bar 
    fi 
done 

ただし、最後に貼り付けたファイルのみがバーに表示されているようです。すべてのデータを完全に上書きすることなく、毎回バーに新しい列を追加して貼り付けるべきではありませんか?

File1 File2 Expected_Output Actual_Output 
1 4  1 NaN 1 4 1 NaN   1 NaN 
2 5  2 7  2 5 2 7   2 7 
3 6  3 8  3 6 3 8   3 8 
+1

あなたは 'paste $ foo> bar'を使っています。これは' bar'の以前の内容を削除します。追加するには '>>'を使いたいでしょう。 – fedorqui

答えて

7

あなたpasteコマンドは、最後にあなただけの最後のファイルを持っていることを説明し、ループ内の各反復、でファイルbarを上書きします。

declare -a FILES=() 
for foo in *; 
do 
    if awk '*condition* {exit 1}' $foo 
    then        
    :       
    else 
    FILES+=("$foo") 
    fi 
done 
paste "${FILES[@]}" > bar 

このコードはFILESという名前の配列にあなたの条件に一致するすべてのファイル名を蓄積し、pasteは一度だけ、個別にすべてのファイル名を拡張し、引数を引用し(これは"${FILES[@]}"が何をするかである)とbar出力をファイルにリダイレクト呼び出します。

awk '*condition* {exit 1}' "$foo" || FILES+=("$foo") 

||状態を表し、バッシュの論理演算子の遅延評価を行っているので、右に文は次のとおりです。

さらにと/そして/ elseブロックがあれば、あなたは全体を置き換えることができますawkがゼロ以外の戻りコードを返す場合にのみ実行されます。

ファイルの名前に特殊文字が含まれる場合は、"$foo"awkに渡す)を引用していますのでご注意ください。

+0

ありがとう、これは問題を非常にエレガントに解決します。私は、各反復の後に、貼り付けコマンドはファイルに新しい列を追加するだけで、bashが ">>"を追加するのと同様に考えるべきだと考えました。どうやらこれは当てはまりません。 – mannaroth

+1

あなたは、ペーストがやっていることをやっているユーティリティを想像することができますが、それはあまり効率的ではありません。ご注意ください提案されたソリューションに提案を追加して、コードをさらに単純化して引用符を修正することができます。 – Fred