印刷ファイル名を読み、フィールドをアルファベット順に並べ替え、htmlタグを追加して最終的に次のようなhtmlファイルを作成するforループを作成しようとしています。
<h3 id= filename> file </h3>
<li> field2(field3)</li>
<li> field2(field3)</li>
<li> field2(field3)</li>...
<h3 id= filename> file </h3>
など。
これまで私はこれを持っています:
for file in *.csv; do
awk 'FNR == 1{ print "<h3 id=" file ">" file "</h3>" }' | sort -t"," -k2 | awk -F "," '{print "<li>" $2 "(" $3 ")<\li>" }' > *.html
done
最後の2つのコマンドは一緒にうまく機能しましたが、最初のコマンドは問題を引き起こし、最終的に空のHTMLファイルが発生しました。また、この状況に対して正しいforループを作成したかどうかはわかりません。
ベストアンサー1
あなたは(読みやすくするためにいくつかのフォーマットを変更しました):
for file in *.csv; do
awk 'FNR == 1{ print "<h3 id=" file ">" file "</h3>" }' |
sort -t"," -k2 |
awk -F "," '{print "<li>" $2 "(" $3 ")<\li>" }' > *.html
done
最初の
awk
コマンドは意味がありません。何も入力されませんでした。標準入力また、ファイルのリストを引数として受け取りません。つまり、何も処理しません。→次のようにawkに入力を提供する必要があります。
awk '...awk script here...' "$file"
または、次のように入力して標準入力。
awk
変数を参照しようとしていますfile
。しかし、そのような変数はありません。もちろん一つあります。シェル変数には対応する名前がありますが、awk
これについて知られているものはありません。file
→変数をに提供する必要がありますawk
。次のようにできます。awk -v file="$file" ...
挿入する方法
sort
〜サイ二人awk
の通話はぎこちなく見えた。→
sort
最初に呼び出してから出力します。awk
<ul>...</ul>
リスト要素を中心に作成しないでください。→出力にこれらの要素を含めましょう。
出力をにリダイレクトしようとしています
*.html
が、目的の結果は出ません。これにより、現在のディレクトリにあるファイルによって異なる動作が生成されます。→入力ファイル名に基づいて出力ファイル名を設定する必要があります。
something.csv
という入力ファイルを出力するには、次のように書くsomething.html
ことができます。"${file%.csv}.html"
式は、変数の内容を削除する
${file%.csv}
bash式です。.csv
file
おそらく似たようなものが欲しいようです。
#!/bin/bash
for file in *.csv; do
sort -t"," -k2 "$file" |
awk -v file="$file" -F"," '
BEGIN {
printf "<h3 id=\"%s\">%s</h3>\n", file, file
printf "<ul>\n"
}
{
printf "<li>%s (%s)</li>\n", $2, $3
}
END {
printf "</ul>\n"
}
' > "${file%.csv}.html"
done
与えられた入力:
alice,8,alice,alice,alice
bob,6,bob,bob,bob
carol,7,carol,carol,carol
david,5,david,david,david
edith,4,edith,edith,edith
frank,3,frank,frank,frank
grace,2,grace,grace,grace
これにより、次のような出力が生成されます。
<h3 id="file1.csv">file1.csv</h3>
<ul>
<li>2 (grace)</li>
<li>3 (frank)</li>
<li>4 (edith)</li>
<li>5 (david)</li>
<li>6 (bob)</li>
<li>7 (carol)</li>
<li>8 (alice)</li>
</ul>
printf
(私はawkスクリプトで使用するものを置き換えることができますが、使いprint
やすくprintf
なります。)