저는 이 명령을 사용하여 텍스트 파일을 처리하고 있으며 목표는 출력을 CSV 형식으로 저장하는 것입니다.
awk -f test.awk /FILES/detail-1019:01 > detail-1019_01.csv
하지만 문제는 파일이 많고 각 파일에 대해 개별적으로 처리 명령을 실행하고 싶지 않다는 것입니다. 그렇다면 처리 명령을 실행하고 각 파일을 CSV 형식으로 한 번에 저장하려면 어떻게 해야 할까요?
파일 이름 입력:
detail-1019:17
detail-1019:18
detail-1019:19
detail-1019:20
detail-1019:21
detail-1019:22
내가 원하는 출력 파일 이름:
detail-1019_17.csv
detail-1019_18.csv
detail-1019_19.csv
detail-1019_20.csv
detail-1019_21.csv
detail-1019_22.csv
답변1
넌 할 수있어
for f in /FILES/detail*; do awk -f test.awk $f > $(echo $f | sed -e 's/^\/FILES\///' -e 's/:/_/').csv; done
답변2
이 문제를 해결하는 두 가지 주요 방법이 있습니다.
awk
코드가 호출되고 출력이 현재 입력 파일에서 파생된 이름으로 리디렉션되는 쉘 루프를 사용하거나awk
한 번 전화해모두file을 인수로 사용하고 출력을 스크립트에서 적절하게 이름이 지정된 파일로 출력합니다awk
. 이는 파일이 수천 개 미만인 경우에만 가능합니다.
awk
우리는 귀하의 코드를 볼 수 없으므로 무엇을 변경해야 하는지 제안할 수 없으므로 이 두 가지 중 두 번째에 대해서는 다루지 않겠습니다 ( NR
예: 사용 중인 경우에는 using으로 변경해야 할 수도 FNR
있고 다른 사람이 되십시오).
쉘 루프를 사용하십시오:
for pathname in /FILES/detail-*:??; do
name=${pathname##*/}
awk -f script.awk "$pathname" >"${name%:??}_${name##*:}.csv"
done
여기에 사용된 세 가지 매개변수 대체는 다음과 같습니다.
${pathname##*/}
, 경로 이름에서 디렉터리 경로를 제거하고 문자열의 파일 이름 부분만 남깁니다.${name%:??}
, 파일 이름에서 후행:
문자와 다음 두 문자를 제거합니다name
. 그런 다음 비트는 밑줄로 연결되고...${name##*:}.csv
:
, 파일 이름이 끝나기 전에 모든 것을 제거 하고.csv
끝에 파일 이름 접미사를 추가합니다.
두 번째 및 세 번째 대체는 :
파일 이름의 끝을 대체하여 _
출력 파일 이름을 만드는 데 사용됩니다.