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

마지막 두 명령은 함께 잘 작동했지만 첫 번째 명령이 문제를 일으키고 결국 빈 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가 더 쉽습니다.)

관련 정보