できるだけ具体的かつ明確に説明しようとします。
ファイルがあります。log.txt
複数の文字列が含まれています。この文字列を検索して印刷して計算します。
一致するファイルの列のみを印刷するコマンドは次のとおりですlog.txt
。
sed -n '1p' log.txt | awk '{ s = ""; for(i = 25; i <= NF; i++) s = s $i "\n"; print s}'
説明する
sed -n '1p' //prints the first line
awk '{ s = ""; for(i = 25; i <= NF; i++) s = s $i "\n"; print s}' //prints the next columns from the number 25 column
入力する:
Column25 Column26 Column27 ColumnN <--#first filter:I need obtain specific headers. ColumnN
Column25 Column27 ColumnN
Column26 Column27 <--#Count how many times is repeat every string in whole file
出力:
Column25
Column26
Column27
Column28
Column29
ColumnN
私はこれを試みます:file.log
前の出力で同じファイルの同じコマンドですべての偶然の一致を計算したいと思います。
sed -n '1p' log.txt | awk '{ s = ""; for(i = 25; i <= NF; i++) s = s $i "\n"; print s}'
次のように出力に戻します。
希望の出力:
Column25 - n times
Column26 - n times
Column27 - n times
Column28 - n times
Column29 - n times
ColumnN - n times
PS。私は検索を開始するためにforループで同じ変数を使用することを検討しましたが、うまくいきませ"$s"
ん。
答え1
この問題を解決した方法は次のとおりです。
awk '{n=1;if(NR==1)n=25;for(i=n;i<=NF;i++) a[$i]++} END{for(val in a) print val,a[val]}' input.txt
最初の行でフィールド25以上をキャプチャするには、NR
変数を確認し、n
ループに使用する変数を設定する必要があります。これはa[$i]++
、フィールドがキーであり、配列の値が++
演算子によって増加される連想配列になります。これはawkの非常に一般的なフィールド計算方法です。
答え2
どうですか?
awk '{for (i=25; i<=NF; i++) print $i; exit}' file | sort | uniq -c
6 string1
6 string2
6 string3
6 string4
6 string5
6 stringN
編集する:新しく追加された入力例には、計算が開始される前に無視される24個のフィールドがなく、最初の行(最初のコードスニペットから推論される)の制限がなくなったようです。努力する
tr -s ' ' '\n' <file | sort | uniq -c
2 Column1
2 Column2
3 Column3
3 ColumnN