awkで文字列を使用して列番号を決定する

awkで文字列を使用して列番号を決定する

次のようにパイプで区切られたファイルがあるとします。

|Sr|Fruits|Colors|
|1 |apple |red|
|2 |orange |orange
|3 |grapes |purple|

ここでは明らかに「果物」と「色」の列が使用awkされます。 $2$3

後で列の順序が変更された場合は、文字列を使用して列番号を確認できますか?

つまり$3であり果物はい$2

答え1

少し気まずい感じですが、常に次のコード行を使用して列番号を見つけます。

head -1 file | sed 's/delimiter/\n/g' | nl
ここでは、ファイルのヘッダー行を取得し、パイプを介してsed\ n区切り文字に置き換えます。その結果、各列ヘッダーが新しい行に表示されます。最後に、nl元の列番号に対応する行番号にパイプします。

答え2

あなたは試すことができます:

$ awk -F'|' '
{
  for(i=1;i<=NF;i++) {
    if($i == "Fruits")
      printf("Column %d is Fruits\n", i-1)
    if($i == "Colors")
      printf("Column %d is Colors\n", i-1)
  }
  exit 0
}
' file
Column 2 is Fruits
Column 3 is Colors

実際の列は次のとおりです。果物そしてはい$3、そして$4

答え3

おそらく、最初の行のすべての列を印刷してこれらの2つのフィールドを調べるだけでなく、新しい列、その名前、順序の変更などを検出できるようにする方が良いでしょう。

awk -F'|' ' { for (i = 1; i <= NF; ++i) print i, $i; exit } ' file

出力:

1
2 Sr
3 Fruits
4 Colors
5

答え4

別の可能性は、フィールド区切り文字を|レコード区切り文字として処理し、最初の行を処理することです。

colnum.awkから:

BEGIN {
  RS = "|" 
}
/^Fruits$|^Colors$/ {
  print $0, NR - 1
}
$ head -n1 fruits.txt | awk -f colnum.awk
Fruits 2
Colors 3

関連情報