AWK에서 문자열에 변수 삽입

AWK에서 문자열에 변수 삽입

루프와 awk 명령을 사용하여 간단한 bash 스크립트에 변수를 전달하려고 합니다.

#!/bin/bash
#! script to filter data to respective directories.

for i in {1..9};
do
        awk  -F "\t" -v num="$i" '$3 ~ /^ *2017-0$num/ {print}' source1.txt source2.txt  > energydata/2017/$i/results.txt
done;

다음과 같이 awk 명령을 성공적으로 실행할 수 있습니다.

        awk  -F "\t" '$3 ~ /^ *2017-01/ {print}' source1.txt source2.txt  > energydata/2017/1/results.txt

나는 날짜의 월 열을 반복하여 이 프로세스를 자동화할 수 있기를 원합니다. -v 변수 pass를 잘못 사용하고 있는 것 같지만 이와 같은 날짜에 변수를 추가하는 방법을 알 수 없는 것 같습니다. 설정된 날짜에 awk 문을 인라인으로 실행하면 작동할 것이라는 것을 알고 있습니다. 단지 나를 막는 변수를 삽입하려고 하는 것뿐입니다.

어떤 팁이나 제안이라도 도움이 될 것입니다

입력 및 출력 예:

소스 1.txt:

1   dog   2020-02-03 
2   cat   2017-01-12

소스 2.txt:

5   Frog  2022-02-05 
7   Mouse   2017-01-11

출력: 에너지데이터/2017/01/results.txt

2   cat   2017-01-12
7   Mouse   2017-01-11

답변1

제 기억이 맞다면 이 /.../ 구문은 AWK의 상수 정규식에만 작동합니다. 다른 정규식과 일치시키려면 이를 문자열로 전달해야 합니다. 또한 $번호가 매겨진 필드를 선택하는 연산자만으로는 변수를 확장하지 않습니다. 대신 문자열 및/또는 변수를 연속해서 작성하여 연결하면 됩니다.

예를 들어, 이것은 작동합니다

% echo 2017-01 | awk -v m=1 '$1 ~ "2017-0" m { print "match" }'
match

또는 이렇게 할 수도 있지만 { pattern = "2017-0" m; if ($1 ~ pattern) ... }그렇게 간결하지는 않습니다.


어쨌든 입력 줄을 내용에 따라 파일로 분할하려면 AWK가 파일 이름을 만들고 출력 파일 자체를 열도록 할 수도 있습니다.

예를 들어, 이는 , 및 와 같은 파일 이름을 작성합니다. 여기서 및 는 행의 세 번째 필드에서 선택됩니다. 그러나 사전에 디렉터리를 생성해야 합니다.energydata/yyyy/mm/results.txtyyyymm

awk -F "\t" '{ split($3, date, "-");
               filename = "energydata/" date[1] "/" date[2] "/results.txt";
               print > filename }' source.txt

관련 정보