루프와 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.txt
yyyy
mm
awk -F "\t" '{ split($3, date, "-");
filename = "energydata/" date[1] "/" date[2] "/results.txt";
print > filename }' source.txt