디렉터리의 각 파일에 대해 awk를 실행하고 각 파일의 출력(동일한 파일 이름 사용)을 다른 디렉터리에 저장합니다.

디렉터리의 각 파일에 대해 awk를 실행하고 각 파일의 출력(동일한 파일 이름 사용)을 다른 디렉터리에 저장합니다.

본질적으로 내가 원하는 것은 디렉터리의 모든 텍스트 파일에 대해 비파괴적으로 awk를 실행하고 결과를 얻는 것입니다.동일한 파일 이름을 가지고 있습니다다른 디렉토리에

즉, awk를 사용하여 디렉토리의 모든 파일에 대해 작업을 수행하고 결과는 동일한 파일 이름을 가진 파일에 대해 awk를 실행한 결과가 포함된 디렉토리입니다.

f1.txt, f2.txt 및 f3.txt 파일이 포함된 foo 디렉토리에 있다고 가정합니다. 각 파일에서 script.awk를 실행하고 싶고 결과는 bar/f1.txt, bar/f2.txt 및 bar/f3.txt에 있습니다.

답변1

너무 많은 것은 없습니다. 파일을 반복하고 파일 이름 앞에 출력 디렉터리 이름을 붙이면 됩니다.

outputdir=bar
mkdir -p "$outputdir"
for f in ./*.txt; do
    awk -f script.awk < "$f" > "$outputdir/$f"
done

이는 입력 파일이 현재 디렉터리에 있고 outputdir해당 디렉터리에 상대적이라고 가정합니다. 따라서 동일한 레벨에 foo/and 가 있는 경우에는 and 를 설정 해야 합니다 .bar/cd foooutputdir=../bar


그렇지 않은 경우 입력 디렉터리 이름을 제거해야 합니다 $f. 접두사 제거 확장은 ${var#pattern}여기에서 작동합니다.

outputdir=./bar
inputdir=./foo
mkdir -p "$outputdir"
for f in "$inputdir"/*.txt; do
    awk -f script.awk < "$f" > "$outputdir/${f#"$inputdir"}"
done

"$outputdir/$(basename -- "$f")"또는 귀하에게 더 친숙한 유사한 것을 사용할 수도 있습니다. (디렉토리 이름이 좋지 않은 경우 따옴표에 주의하세요.)

답변2

GNU awk를 사용한 "내부" 편집:

cp -r foo bar &&
awk -i inplace 'script' bar/*

답변3

완전성을 위해 스크립트를 제어하는 ​​경우할 수 있는여기서 처리하세요.

 awk -vout=../bar/ '$2=="cow" {print "moo",$3,$1 > out FILENAME; next} $4!="fox" {print > out FILENAME}' *

그러나 이것은 일반적으로 번거로운 작업이므로 개인적으로 다른 답변을 선택하겠습니다. ~처럼에드GNU awk를 제외하고는 다소 작은 항목을 분리 -v하고 괄호로 묶은 다음 변경하여 호출을 추가해야 할 수도 있습니다. 이는 더 번거롭다고 생각합니다. :-(>(out FILENAME)>>close(out FILENAME)

관련 정보