0

したがって、複数の列である約1000個のファイルがありますが、これらの列のうちの2つの統計にのみ関心があります。$ 4が星のスペクトルクラスのようなもの(つまり、一意の値)であり、これらの各ファイルの$ 5が結果である場合(表示、未表示、不明など)、そのような統計をgrepまたはawkするための推奨される方法はありますか? 1000ほどのファイルなので、次のようになります。

Type O, #verified, #not-verified, #property-j, ...
Type B, ...
Type A, ...
.
.
.
Type i,

ここで、各ファイルには、次のようなものが表示されます。

$1, $2, $3, Spectral Type, Result
foo, foo, foo, A, verified
foo, foo, foo, G, verified
foo, foo, foo, A, unknown
foo, foo, foo, F, verified
foo, foo, foo, G, verified
foo, foo, foo, K, verified
foo, foo, foo, K, seen
4

3 に答える 3

1

区切り文字がカンマだけで、エスケープを伴うCSV解析が必要ない場合は、cutユーティリティを使用します。

cat $file | cut -d, -f4
于 2012-06-20T16:48:24.437 に答える
1

質問が次の場合:「「タイプ$ 4、$ 5」の形式の出力を生成するにはどうすればよいですか。ここで、$4と$5はそれぞれ入力の4番目と5番目の列です。」1つの解決策は次のとおりです。

for i in list of input file; do
  awk '{print "Type "$4, $5}' $i > $i.result
done

これにより、希望どおりの出力が得られますが、空白を含まないすべての列に依存します。空白がある可能性がある場合は、次のことができます。

 awk '{printf( "Type %s, %s", $4, $5 )}' FS=, $i > $i.result

ただし、これによって生成される余分な空白を削除することをお勧めします。この例では、入力ファイルのリストを「list」、「of」、「input」、「file」の4つのファイル名にハードコーディングしていますが、名前を入力する必要はありません。代わりに、何らかの方法でそれらを生成する必要があります。私は、ファイルのセットを反復処理する(多くの!)方法の1つを示しているにすぎません。awkこの質問の核心は、反復ではなく、を扱う部分であるように思われます。

質問を2回目に読むと、入力ファイルごとに1つの行があり、結果を1つのファイルに要約する必要があることがわかります。その場合は、次のようにしてください。

cat list of all files | awk '{print "Type "$4, $5}'
于 2012-06-20T17:56:45.690 に答える
1
perl -aF, -nle '{${$h{@F[3]}}{@F[4]}=1}END{while(($k,$v)=each%h){print"$k, @{[keys%$v]}";}}' files

編集

なぜこれが問題を解決するのか。

フラグ情報タイプの場合

perl --help

アルゴリズム

{..} END{..}    # first block is evaluated on each line, END block only once at the end

@F[3]は$F[3]と記述されている必要があります。違いは、@ F [3]が1つの要素の配列であり、$F[3]が要素であるということです。

${h{$F[3]}}     # gets value or creates and return a new entry in the hash %h with key $F[3] third element of array @F
${..}{$F[4]}=1  # supposes that value in hash %h is type HASHREF and creates a new entry with key 

式全体を書くこともできますが(おそらくもっと簡単です)、それが最初に私に来た最初の構文でした

$h{$F[3]}{$F[4]}=1

終わり

while(($k,$v)=each%h)  # loop over entries of hash %h
"@{[..]}"   # is a trick to display array in a double quote expression
%$v         # dereferences HASHREF

問題のより近い解決策:

perl -lnaF'/\s*,\s*/' -e '{$h{$F[3]}{$F[4]}=1;}END{while(($k,$v)=each%h){print("Type $k, ",join(", ",map("#$_",keys%$v)));}}'

注:この場合、印刷後の括弧はオプションですが、読みやすくするために保持され、カーリーブレーキを閉じる前にセミコロンも使用されます

于 2012-06-20T19:22:22.917 に答える