私はシェルスクリプトに初めて触れました。これで、.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
答え2
私は専用csv
パーサーを使用します。たとえば、python's
csv
モジュールは次のことを行います。
import csv
with open('file.csv') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print(row["Index"], *[item[0] for item in row.items() if item[1] == "X"], sep=" ")
出力:
row1 Name1 Name3
row2 Name3
row3 Name1 Name2 Name3