2017-01-20 5 views
1

いくつかの測定値を含むファイルのリストがあります。それらを1つのファイルにコンパイルしたいと思います。 2番目の列に数値データが含まれている場合(または列の各行にNaNが含まれていない場合)は、ファイル全体を新しい列のマスターファイル(バー)に貼り付ける必要があります。Awkは、1つの行要素のみの条件に基づいて列全体を出力します。

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

現在のところ、私のコードでは、2番目の列に1つでもNaNがあるファイルはすべて拒否されます。たぶん

for foo in *; do cat $foo | awk '{if ($2 ~ /[0-9]/) print $0}' >> bar ;done 
+0

あなたは一連のファイルを持っています。それらのうちの1つを指定すると、2番目のフィールドのいずれかが数字の場合、ファイル全体をマスターに貼り付ける必要があります。他のものを順番に貼り付けたいですか( 'cat file1 >> master; cat file2 >> master')か、もう一方を貼り付けますか?いくつかの[mcve]はその質問を明確にするでしょう。 – fedorqui

+0

私はそれらをもう一方の隣に貼り付けることを願っています。私はそれを行う前に貼り付けを使用していましたが、私は入力として持っているファイルの数が大きすぎるので、測定せずにファイルを拒否する必要があります(ほとんどのファイルが実際に)。彼らは別々の問題です。わかりやすくするために、私は上記の質問の問題を分けるべきですか? – mannaroth

+0

はい、私はそれが分かりやすくするために最善だと思います。複数のファイルを並べて貼り付ける場合は、[複数のファイルを並べて貼り付ける]を参照してください(http://stackoverflow.com/a/17075524/1983854)。 – fedorqui

答えて

2

のbashやawkでのこのような何か、:

for f in files*; 
do 
    if awk '$2 ~ /[0-9]/{exit 1}' $f # awk to detect numeric value, return 1 when 
    then        # above, consider /^[0-9]*$/ or such, see comments 
     echo 1       # no need for this, so use : 
    else 
     echo 0       # cat $f >> masterfile.txt 
    fi 
done 

すなわち。 awkは、$2に単一の数値が存在するかどうかを検出するためにのみ使用され、awkは終了コード1で終了します。これはbashで正の一致を検出するために使用されます。デフォルトでは、awkはコード0で終了します。

+1

ニース!おそらく '/^[0-9] * $ /'と書く価値がありますが、2番目の列には数値データが含まれていますが少し曖昧です。 – fedorqui

+0

@fedorqui私は知っているが、私は許されないし、OPコードを読んだ。 ; D –

+1

@fedorquiありがとう、これは私の問題を解決します。しかし、 "#cat $ f >> masterfile.txt"は "#elseの必要はありません"のコメントを置き換える必要があります。 – mannaroth

関連する問題