두 파일 간의 매핑

두 파일 간의 매핑

저는 스크립팅을 처음 접했고 다음과 같은 요구 사항이 있습니다.

다음 내용이 포함된 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

관련 정보