2017-02-28 18 views
2

ディレクトリにファイルのリストがあります。たとえば、以下のファイルは各ファイルの名前で、最初の行が表示されます(各ファイルには重要ではない行がいくつかあります)。ディレクトリ内に複数のファイルのしきい値を設定する

グループ1

8 325 
quick brown fox jumped 
Over the lazy dog 

グループ2

8 560 
There is more content here 

グループ3

7 650 

私が最初に読みたいです最初の値が8で、2番目の値が500より大きいかどうかを確認します。この条件が満たされている場合は、ファイルの名前を新しいテキストファイルに出力します。私はこれが私のヘッダ名を持つファイルと

=> Group1 <= 
8 325 

=> Group2 <= 
8 560 

=> Group3 <= 
7 650 

今ディレクトリ内の各ファイルの最初の行を与える

for f in *.Group; 
do head -n1 *.Group > new-file; 
done 

を使用してみました

Group2 

結果、私はしきい値に基づいてファイルをフィルタリングしたいが、suではないすべてのヘッダーを最初の列に変換し、対応する値を2番目の列に変換する方法を再考します。次に、しきい値を適用してファイルをフィルタするのは簡単です。それとももっと良い方法がありますか?

+0

'Group1'または' Group1.Group'? – FloHe

+0

グループ1、グループ2、..など – Paul

答えて

4

あなたはawk使用することができます。

awk 'FNR==1 && $1==8 && $2>500{print FILENAME}' *.Group > Result 

説明:

# FNR contains the number of line of the current(!) input 
# file. Check if the conditions are met and print the filename 
FNR==1 && $1==8 && $2>500 { 
    print FILENAME 
} 

上記溶液はawkのすべてのバージョンで動作するはずですが。 GNU awkをお持ちの場合はnextfileという表現を利用できます。これを使用すると、最初の行が処理された後に入力ファイルの残りの行がスキップされます。

# Check if the conditions are met and print the filename in that case 
$1==8 && $2>500 { 
    print FILENAME 
} 

# Skip the remaining lines in the current file and continue 
# with the next file 
{ 
    nextfile 
} 
+0

awk -F '' '{print NF}' Group1というファイルの最初の行のフィールド数を確認したところ、6と表示されます。それらはちょうど2つの別々のフィールドではないので、少し違ってください。 – Paul

+0

'-F '''は、行を別々の文字に分割します。 'Group1'は6文字ですが、それは正しいです。で、どういう意味ですか? – hek2mgl

+0

ごめんなさい、混乱しました。完璧に動作します! – Paul

関連する問題