AWK 명령을 사용하여 동일한 이름의 csv 파일로 변환

AWK 명령을 사용하여 동일한 이름의 csv 파일로 변환

저는 이 명령을 사용하여 텍스트 파일을 처리하고 있으며 목표는 출력을 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

이 문제를 해결하는 두 가지 주요 방법이 있습니다.

  1. awk코드가 호출되고 출력이 현재 입력 파일에서 파생된 이름으로 리디렉션되는 쉘 루프를 사용하거나

  2. awk한 번 전화해모두file을 인수로 사용하고 출력을 스크립트에서 적절하게 이름이 지정된 파일로 출력합니다 awk. 이는 파일이 수천 개 미만인 경우에만 가능합니다.

awk우리는 귀하의 코드를 볼 수 없으므로 무엇을 변경해야 하는지 제안할 수 없으므로 이 두 가지 중 두 번째에 대해서는 다루지 않겠습니다 ( NR예: 사용 중인 경우에는 using으로 변경해야 할 수도 FNR있고 다른 사람이 되십시오).


쉘 루프를 사용하십시오:

for pathname in /FILES/detail-*:??; do
    name=${pathname##*/}
    awk -f script.awk "$pathname" >"${name%:??}_${name##*:}.csv"
done

여기에 사용된 세 가지 매개변수 대체는 다음과 같습니다.

  1. ${pathname##*/}, 경로 이름에서 디렉터리 경로를 제거하고 문자열의 파일 이름 부분만 남깁니다.
  2. ${name%:??}, 파일 이름에서 후행 :문자와 다음 두 문자를 제거합니다 name. 그런 다음 비트는 밑줄로 연결되고...
  3. ${name##*:}.csv:, 파일 이름이 끝나기 전에 모든 것을 제거 하고 .csv끝에 파일 이름 접미사를 추가합니다.

두 번째 및 세 번째 대체는 :파일 이름의 끝을 대체하여 _출력 파일 이름을 만드는 데 사용됩니다.

관련 정보