0

私はテストawkしていて、この考えを得ました。

raja@badfox:~/Desktop/trails$ cat num.txt
1   2   3   4
1   2   3   4
4   1   2   31
raja@badfox:~/Desktop/trails$ awk '{ if ($1 == '4') print $0}' num.txt
4   1   2   31
raja@badfox:~/Desktop/trails$ 

したがって、コマンドはファイル名num.txtの最初の列で4をチェックします。

したがって、列4にも4があるので、出力が必要です。たとえば、100列の情報があり、検索している用語の列数として出力を取得したい場合です。

上記の例から、出力として列4と列1が必要であり、4を検索しています。

4

2 に答える 2

2

検索項目(この場合は値4)を含む行を検索しようとしていて、そのような値が行(および行のデータ)にいくつ表示されるかをカウントしたい場合は、何かが必要です。お気に入り:

awk '{ count=0
       for (i = 1; i <= NF; i++) if ($i == 4) count++
       if (count) print $i ": " $0
     }'

これは、1つのSOラインに完全には適合しません。

検索値が含まれている列を特定するだけの場合は、次を使用できます。

awk '{ for (i = 1; i <= NF; i++) if ($i == 4) column[i] = 1 }
     END { for (i in column) print i }'

これにより、検索値4を含む各列の(連想)配列要素column[i]が1に設定されます。最後のループは、4を含む列番号を不確定な(ソートされていない)順序で出力します。GNUawkにはソート関数(asortasorti)が含まれています。POSIXawkはそうではありません。ソートされた順序が重要な場合は、次のことを考慮してください。

awk 'BEGIN { max = 0 }
           { for (i = 1; i <= NF; i++) if ($i == 4) { column[i] = 1; if (i > max) max = i } }
     END   { for (i = 1; i <= max; i++) if (column[i] == 1) print i }'
于 2012-09-11T15:31:18.403 に答える
1

NFあなたは変数を探しています。これは、行のフィールド数です。

使用方法の例を次に示します。

{
    if (NF == 8) {
        print $3, $8;
    } else if (NF == 9) {
        print $3, $9;
    } 
}

またはループ内:

# This will print the line if any field has the value 4
for (i=1; i<=NF; i++) {
    if ($i == 4)
        print $0
}
于 2012-09-11T15:23:13.743 に答える