다음 명령을 실행하는 동안 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
은 서브셸 내에서 실행됩니다(괄호로 구분). 따라서 서브쉘이 종료되면 현재 디렉토리는 원래 값으로 복원됩니다.