
2つの列を持つテキストファイルがあり、最初の列は名前で、2番目の列は時間値です。良い:
cat 34M
dog 34M
fish 12M
ant 34M
同じ値に対して2番目の列を比較する必要があり、1が残りの列と異なる場合は、その項目を表示したいと思います。したがって、この場合は他の魚とは異なるため、タグを付ける必要があります。ファイルは動的でフォルダごとにforループを介して変更されるため、私のスクリプトはforループで比較を実行する必要があります。
for FOLDER in is find ${DIR}/ -maxdepth 1 -type f -name values.txt`; do
<something to flag the 'odd' value>
done
2番目の列を最初にソートしてから、最初の(最も高い)値をメインマークとして比較する必要があると思います。ファイルには、2つ以上の「奇数」値を含めることができます。ファイルには2〜500項目を含めることができます。添え字やawkで何かできますが、どこから始めるべきかわかりません。
助けてくれてありがとう。
答え1
値がメモリに収まる場合、「最大500」は次のようになり、必要に応じてawk
たぶん可能かもしれません。1つのステップで(少なくともほとんど)1つのプロセスで。
一度発生するすべての値(複数の値がある場合)を順序に関係なく一覧表示します。
awk '!n[$2++]{a[$2]=$1} END{for(v in n)if(n[v]==1)print a[v],v}'
# can pipe output to a suitable sort if you want a specific order
# or for GNU awk 4, you can get several non-arbitrary orders
# (less than GNU sort) using PROCINFO["sorted_in"] see the manual
一度発生する値をリストします(少なくとも1つある場合)。
awk '!n[$2++]{a[$2]=$1} END{for(v in n)if(n[v]==1){print a[v],v;exit}}'
一度発生し、それ以外の場合は存在しない値をリストします。
awk '!n[$2++]{a[$2]=$1} END{for(v in n)if(n[v]==1){print a[v],v;exit};print "no unique entry"}'
答え2
1つの方法は次のとおりです。
awk -v std="$( awk '{print $2}' file.txt | \
sort | \
uniq -c | \
sort -rn | \
awk 'NR==1 {print $2; exit}' )" '$2!=std' file.txt
内部の長いコマンドは$(...)
最も一般的な時間値を決定しますが、外部awk
コマンドは一意の値を持つ2番目の列のすべての項目を選択します。スクリプトは、などの可能な時間「別名」を考慮せずに、単に1M = 60S
文字列12M
を34M
処理します。
答え3
diffを使ってみましたか?このツールは、2つのファイルの最初の列が一致した場合に完全にフィットします。それ以外の場合は、単に2番目の列を取得してdiffと比較できます。スクリプトでdiffを使用することもできます。