여러 폴더를 반복하고 명령을 실행한 다음 파일에 씁니다.

여러 폴더를 반복하고 명령을 실행한 다음 파일에 씁니다.

다음 명령을 실행하는 동안 10개의 폴더를 반복하고 싶습니다.

awk 'FNR > 1' *.csv | sort -sk 1,2 | sort -sk 3,3 > ${f}_appended.dat

다음과 같이 for 루프 래퍼를 사용하세요.

for f in */ ; do awk 'FNR > 1' *.csv | sort -sk 1,2 | sort -sk 3,3 > ${f}_appended.dat; done

각 폴더에만 쓰기 만 _appended.dat하고 루프를 통과하는 폴더의 파일에 대해 명령을 실행하지 않고 루트 폴더(있는 경우)에 명령을 실행합니다.

원하는 결과:

awk 명령을 사용하여 생성된 모든 폴더에는 _appished.dat 파일이 있습니다. 따라서 10개의 폴더가 있으며 각 폴더에는 .csv 파일의 내용을 기반으로 생성된 고유한 파일이 있습니다.

답변1

그러면 각 하위 디렉터리의 awk파일에 대해 명령이 실행 되고 해당 디렉터리에 출력이 포함된 *.csv파일이 남게 됩니다 .{dirname}_appended.dat

for f in */
do
    awk 'FNR > 1' "$f"/*.csv | sort -sk 1,2 | sort -sk 3,3 >"${f}${f%/}_appended.dat"
done

논의하다

고려하다:

for f in */ ; do awk 'FNR > 1' *.csv | sort -sk 1,2 | sort -sk 3,3 > ${f}_appended.dat; done

루프가 실행될 때마다 *.csv현재 디렉터리의 파일이 처리됩니다. 디렉토리에 있는 파일을 가져오려면 대신 를 $f사용하십시오 ."$f"/*.csv*.csv

또한 위의 내용은 각 실행 결과를 파일에 저장합니다.${f}_appended.dat

선택하다

또 다른 방법은 cd각 디렉터리로 이동하여 awk다음 명령을 실행하는 것입니다.

for f in */
do
    ( cd "$f"; awk 'FNR > 1' *.csv | sort -sk 1,2 | sort -sk 3,3 >"${f%/}_appended.dat" )
done

명령 cd은 서브셸 내에서 실행됩니다(괄호로 구분). 따라서 서브쉘이 종료되면 현재 디렉토리는 원래 값으로 복원됩니다.

관련 정보