1列の一意の値をすべて見つけようとします。ただし、このコマンドを使用すると、ヘッダー行も取得できます。スキップするにはどうすればよいですか?
awk -vFPAT='([^,]*)|("[^"]+")|","' '{if ($2!~/NULL/) {print $2}}' Files/* | sort | uniq -c | sort -n | wc -l
サンプルデータは次のとおりです。
"link","shared_story","101","52
"link","published_story","118","100
"link","published_story","134","51
"link",NULL,"152","398
"link","shared_story","398","110
答え1
awk内の現在のファイルの行番号は、特殊FNR
変数(NR
各ファイルの行番号ではなく完全な行番号を保持)に格納されます。したがって、タイトルが最初の行にある場合は、その行をスキップするようにコマンドを変更するだけです。
awk -vFPAT='([^,]*)|("[^"]+")|","' '{if ($2!~/NULL/ && FNR>1) {print $2}}' Files/*
あるいは、特定の文字列に一致するヘッダーの行をスキップすることもできます。
awk -vFPAT='([^,]*)|("[^"]+")|","' '{if ($2!~/NULL/ && !/headerString/) {print $2}}' Files/*
答え2
次のように、1つのawkコマンドを使用して完全な操作を実行できます。
awk -vFPAT='([^,]*)|("[^"]+")|","' 'FNR > 1 && $2 !~ /NULL/ && !seen[$2]++ {cnt++}
END {print cnt}' *.csv
バラよりこここのイディオムの例は、awk
ハッシュを最初に見たときにのみハッシュの値を考慮するために使用されます。したがって、重複除外、固有除外、N発生のみを許可するなど、さまざまな操作に役立ちます。
標準例も参照してくださいawk 組み込み変数、FNRはファイルあたりのレコード数です(入力ファイルの場合は行FNR==NR
あたり)。
通常、最初の行を除くすべてのファイルを解析するためにコマンドを使用したい場合も使用できますtail
。これにより、各ファイルの最初の行が除外され、残りが印刷されます。
tail -n +2 *.csv | command