인쇄 파일 이름을 읽고, 필드를 알파벳순으로 정렬하고 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
첫 번째
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
가 더 쉽습니다.)