2

次の形式のタブ区切り列を持つテキストファイルがあります。

fileName    Type    sc1 sc2 sc3 sc4 sc5 sc6
file1   abc 0   0.2 0   0   0   0
file1   xyz 0   0.8 0   0   0.8 0.2
file2   abc 0.5 0   0   0.1 0   0
file2   xyz 0   0   0   0.7 0.003   0.1
file3   abc 0.002   0   0   0   0.04    0
file3   xyz 0.5 0   0   0   0   0.3
.
. 

最初の行はヘッダー行です。sc1、sc2、sc3などはスコア1、スコア2、スコア3です(すべてゼロではありません)

3つ以上のタイプがあり、各ファイルには同じ数のタイプがあります。

xyzタイプのsc6が最も低いfileNameを知る方法は? または、このファイルから別のテキストファイルを作成する方法を教えてください。このファイルには、すべてのxyzタイプのファイル名とsc6が含まれます。

私は本当にこれをデータベースとしてロードしたり、そのようなことをしたくありません。cutUnixの、sortまたはgrepコマンドを使用して、これをかなり迅速に達成できるかどうか疑問に思いました。すべてのperl、awkソリューションも受け入れられます。

質問があまり明確でない場合はお知らせください。

PSこの質問には別の見出しを提案してください。これは私が思いつくことができる最高のものです。

4

2 に答える 2

3

あなたはこのようなワンライナーを行うことができます:

perl -lanwe 'next unless $F[1] eq "xyz"; 
             $a{$F[0]}{$F[1]} = $F[7]; 
             }{ 
             for my $file (sort { $a{$b}{xyz} <=> $a{$a}{xyz} } keys %a) { 
                 print qq($file : $a{$file}{xyz}); }'

Autosplitは、stdinまたは引数ファイル名(スイッチ)から読み取るときに、-a空白を配列に分割します。入力(「演算子」)の終了後、保存された結果はソートされて印刷されます。「xyz」を除くすべてのタイプをスキップします。@F-n}{

入出力:

file1   abc 0   0   0   0   0   0
file1   xyz 0   0   0   0   0   0
file2   abc 0   0   0   0   0   0
file2   xyz 0   0   0   0   0   0
file3   abc 0   0   0   0   0   0
file4   xyz 0   0   0   0   0   1

file4 : 1
file2 : 0
file1 : 0

注:実際にソートされることを確認するには、入力に行を追加する必要がありました。並べ替えが必要なものの恐ろしいサンプルデータです。

于 2013-02-05T19:58:52.197 に答える
1
awk -v lowest=9999999 '$2 == "xyz" && $8 < lowest { lowest = $8; lowfile = $1 }
                       END {print lowfile, "\t", lowest}' infile

また:

awk '$2 == "xyz"' infile | sort -k 8n | head -1 | cut -f1,8

すべてのxyzに対してfilenameとsc6だけでファイルを作成するには:

awk '$2 = "xyz" {print $1, "\t", $8}' infile > outfile
于 2013-02-05T19:58:50.970 に答える