지금까지 내 스크립트(script.sh)는 다음과 같습니다.
#!/bin/bash/
BEGIN {
print "Author Name of Book ISBN"
print "------ ------------ ----"
}
{ printf "%-9s &s\n", 1$, 2$, 3$ }
END
그런 다음 다음 명령을 실행합니다.
sort -k 3,3 INPUTFILE.INPUT | awk -f script.sh
위의 어느 것도 원하는대로 작동하지 않습니다.
또한 입력 파일의 데이터는 쉼표로 구분됩니다. 또한 awk 명령이 수행하기를 바라는 "루프"를 사용해야 합니다.
답변1
다음은 몇 가지 문제, 일부는 오류 발생, 다른 일부는 오타 또는 오해의 결과입니다.
- 행을
#!
삭제할 수 있습니다. 아니면 삭제해야 합니까?#!/usr/bin/awk -f
awk
(또는 시스템의 어느 곳에서나). 위의 -line을 사용하면 명령줄에서 스크립트를 호출#!
할 필요가 없지만 직접 사용할 수 있습니다(실행 가능한 경우). -line이 없으면 명령줄에서 사용해야 합니다 .awk -f
./script.awk
#!
awk -f
입력 데이터의 특정 필드에 있는 값을 참조하려면 참조하는 필드 번호 대신
$n
where를 사용하세요 .n
n$
형식
printf
문자열에는 형식 자리 표시자가 하나만 있지만 세 가지 데이터를 제공합니다. 또한 매개변수 주위에는 괄호가 없습니다.블록
END
을 제거할 수 있습니다.입력에 공백(공백 또는 탭)으로 구분되지 않고
,
또는 같은 필드 구분 기호가 있는 경우 또는 등을 사용 하거나 블록의 적절한 문자에 변수를 설정하여 이를 표시해야 합니다 . 그렇지 않으면 스크립트가 입력 레코드를 잘못 분할합니다.|
awk
awk -F ','
awk -F '|'
FS
BEGIN
그러면 스크립트( )가 남습니다 script.awk
.
BEGIN {
fmt = "%-15s\t%-15s\t%-15s\n"
printf(fmt, "Author", "Name of Book", "ISBN")
printf(fmt, "------", "------------", "----")
}
{ printf(fmt, $1, $2, $3) }
나는 세 개의 탭으로 구분된 필드 각각을 왼쪽 맞춤 문자열로 형식화하는 형식 문자열을 자유롭게 도입했습니다. 각 필드에는 15자의 공백이 있습니다. 블록을 변경하여 쉽게 fmt
조정할 수 있습니다 BEGIN
.
통화는 다음과 같습니다.
sort -t ',' -k 3,3 INPUTFILE.INPUT | awk -F ',' -f script.awk
여기서는 파일의 데이터가 쉼표로 구분되어 있다고 가정합니다(그리고 sort
이에 따라 명령이 변경되었습니다).