csvファイルを読み取るために複数のコマンドを使用してforループを作成する際に問題があります。

csvファイルを読み取るために複数のコマンドを使用してforループを作成する際に問題があります。

印刷ファイル名を読み、フィールドをアルファベット順に並べ替え、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
  1. 最初のawkコマンドは意味がありません。何も入力されませんでした。標準入力また、ファイルのリストを引数として受け取りません。つまり、何も処理しません。

    →次のようにawkに入力を提供する必要があります。

    awk '...awk script here...' "$file"
    

    または、次のように入力して標準入力

  2. awk変数を参照しようとしていますfile。しかし、そのような変数はありません。もちろん一つあります。シェル変数には対応する名前がありますが、awkこれについて知られているものはありません。

    file→変数をに提供する必要がありますawk。次のようにできます。

    awk -v file="$file" ...
    
  3. 挿入する方法sort 〜サイ二人awkの通話はぎこちなく見えた。

    sort最初に呼び出してから出力します。awk

  4. <ul>...</ul>リスト要素を中心に作成しないでください。

    →出力にこれらの要素を含めましょう。

  5. 出力をにリダイレクトしようとしています*.htmlが、目的の結果は出ません。これにより、現在のディレクトリにあるファイルによって異なる動作が生成されます。

    →入力ファイル名に基づいて出力ファイル名を設定する必要があります。something.csvという入力ファイルを出力するには、次のように書くsomething.htmlことができます。

    "${file%.csv}.html"
    

    式は、変数の内容を削除する${file%.csv}bash式です。.csvfile

おそらく似たようなものが欲しいようです。

#!/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なります。)

おすすめ記事