
저는 스크립팅을 처음 접했고 다음과 같은 요구 사항이 있습니다.
다음 내용이 포함된 jobname.txt라는 파일이 있습니다.
job1
job2
다음 내용이 포함된 value.txt라는 파일이 있습니다.
10
20
다음과 같이 출력을 인쇄해야 합니다.
update_job: job1
max_run_alarm: 10
update_job: job2
max_run_alarm: 20
쉘 스크립트나 awk를 사용하여 이 작업을 어떻게 수행할 수 있나요?
답변1
paste
+ 로 awk
:
$ paste -d'\n' jobname.txt value.txt \
|awk '{ print (NR%2?"update_job:":"max_run_alarm:", $0) }'
기본적으로 paste
이름에서 알 수 있듯이 두 개의 파일을 한 줄씩 붙여넣지만 \n
각 줄 사이에 줄바꿈 문자를 추가한 다음 이전 출력을 다시 처리 awk
하고 필요한 내용을 앞에 추가합니다."텍스트"행 번호가 모듈로 2인 행(짝수 행 번호가 있는 행, 예를 들어 행 번호 2, 4, 6...)의 경우 NR
행 번호에는 다음 행이 포함됩니다.앗처리를 위해 읽어야 함) 텍스트 앞에 "작업 업데이트:"또는 홀수 줄 번호의 경우 앞에 텍스트를 추가합니다."최대 작동 경고:", 그런 다음 줄 자체를 인쇄합니다 $0
.
단지 awk
:
awk 'NR==FNR{
getline val<ARGV[2]; print "update_job:", $0 ORS "max_run_alarm:", val; next
}
{ exit }' jobname.txt value.txt
위에서는 NR이 라인 번호라고 말했습니다. 여기서는 FNR과 FNR이 항상 동일한 값을 가지지만(즉, 둘 다 라인 번호를 포함함) NR은 모든 입력 파일의 모든 라인에 대해 증가된 상태로 유지됩니다. 다음 입력 파일이 읽혀지면(있는 경우) 다시 1로 재설정되므로 NR==FNR
다음 코드 블록이 첫 번째 입력 파일에 대해서만 실행되도록 합니다.
그럼 우리는 "getline
파일에서 변수로 변환"우리가 입력으로 전달한 두 번째 인수에서 한 줄을 읽습니다(여기서는ARGV[2]
return value.txt
)을 입력하고 변수에 저장하면 val
남은 것은 인쇄하는 것뿐입니다. ORS는 각각 사이에 개행 문자를 인쇄합니다.
아니면 이것을 선호할 수도 있습니다(그러나 저는 파일 이름을 하드코딩하는 것을 좋아하지 않습니다).
awk '{
getline val<"value.txt"; print "update_job:", $0 ORS "max_run_alarm:", val
}' jobname.txt
답변2
$ paste jobname.txt value.txt |
awk '{printf "update_job: %s\nmax_run_alarm: %s\n\n", $1, $2}'
update_job: job1
max_run_alarm: 10
update_job: job2
max_run_alarm: 20
아니면 모두 awk로:
$ awk '
NR==FNR { jobs[NR]=$1; next }
{ printf "update_job: %s\nmax_run_alarm: %s\n\n", jobs[FNR], $1 }
' jobname.txt value.txt
update_job: job1
max_run_alarm: 10
update_job: job2
max_run_alarm: 20
위의 두 가지 모두 필수 POSIX 도구를 사용하므로 모든 Unix 시스템의 모든 셸에서 작동합니다.
답변3
그리고 awk
:
awk '{printf "update_job: %s\n", $1 ; getline < "value.txt"; printf "max_run_alarm: %s\n\n", $1 }' jobname.txt
첫 번째 printf
명령은 첫 번째 파일의 행을 인쇄합니다 jobname.txt
. 그런 다음 getline
명령은 파일에서 행을 가져옵니다 value.txt
. 그런 다음 printf
명령은 해당 행을 인쇄합니다.
바라보다http://awk.freeshell.org/AllAboutGetline언제, 어떻게 사용하는지 알아보세요 getline
.
답변4
co=`awk 'END{print NR}' jobname.txt`
for ((i=1;i<=$co;i++)); do awk -v i="$i" 'NR==i{print "update_job: "$1}' jobname.txt; awk -v i="$i" 'NR==i{print "max_run_alarm: "$1}' value.txt;echo -e "\n"; done
산출
update_job: job1
max_run_alarm: 10
update_job: job2
max_run_alarm: 20