文字列に一致する行のヘッダー名を取得します。

文字列に一致する行のヘッダー名を取得します。

私はシェルスクリプトに初めて触れました。これで、.csvファイルのすべての行を読み取り、各行の列ヘッダーのみを取得できるシェルスクリプトコードを見つけようとします。

各行に対して、一部の列は「X」と表示されます(その行に名前があることを示します)。最初の行の名前(例: "row1")が与えられたら、出力で "X"とマークされた列ヘッダーの対応する名前を提供するスクリプトを開発したいと思います。これはCSVファイルなので、「X」とマークされていない列は;分離記号。

入力する

Index,Name1,Name2,Name3,Name4
row1,X,,X       
row2,,,X,              
row3,X,X,X,     

「row1」を検索すると、出力は次のようになります。

出力

row1  Name1 Name3

「row3」を検索すると、出力は次のようになります。

row3   Name1  Name2  Name3 

出力をタブ区切りにしたいが可能ではない場合は、カンマで区切っても機能します。まず、行名を特定し、出力をパイピングしてこれを達成しようとしました。しかし、「X」が表示されている場合は、タイトル名を印刷するスクリプトを書く方法がわかりません。grep -w 'row1'andのいくつかを使用できるアイデアがありますが、awk -F , 'NR==1 { for (i=1;i<=NF;++i) if ($i=="X") { n=i;print $n }}'それらをどのように接続するのかわかりません。

どんな助けでも大変感謝します!

ベストアンサー1

ヘッダーを配列に分割し、そこで使用します。たとえば、次のようになります。

mode.awkのインポート

BEGIN { FS="," }

NR==1 { split($0, colhead); next }

$1 ~ pat {
  printf "%s", $1
  for (i=2; i<=NF; i++) {
    if ($i ~ /X/)
      printf "\t%s", colhead[i]
  }
  print ""
}

たとえば、次のように実行します。

awk -f getpattern.awk pat='row1|row3' infile.csv

出力:

row1    Name1   Name3
row3    Name1   Name2   Name3

おすすめ記事