일반 파일 이름 패턴을 사용하여 길이가 ~200,000행인 .csv 파일 묶음(~300개)이 있습니다.
outfile_n000.csv
outfile_n001.csv
outfile_n002.csv
.
.
.
outfile_nXXX.csv
각 파일에서 행 범위(100013-200013)를 추출하고 추출된 범위를 새 .csv 파일에 저장하고 ptally_
원본 파일을 유지하면서 원본 파일과 구별하기 위해 접두사를 추가해야 합니다.
나는 내가 사용할 수 있다는 것을 안다
sed -n '100013,200013p' outfile_nXXX.csv > ptally_outfile_nXXX.csv
단일 파일에 대해 이 작업을 수행하지만 대규모 파일 배치를 자동화하는 방법이 필요합니다. -i
sed의 옵션을 사용하여 이를 달성 할 수 있습니다 .
sed -iptally_* -n '100013,200013p' outfile_nXXX.csv > ptally_outfile_nXXX.csv
하지만 이렇게 하면 추출된 줄을 작성 outfile_nXXX.csv
하고 원래 파일의 이름을 바꾸는 ptally_outfile_nXXX.csv
것이 목적입니다 -i
.
마찬가지로, 중괄호 확장과 와일드카드를 혼합할 수 없기 때문에 bash의 중괄호 확장은 작동하지 않습니다.
sed --n 10013,20013p *.csv > {,ptally_}*.csv
추출과 이름 바꾸기를 더 간단한 프로세스로 결합하는 우아한 방법이 있습니까? 현재 저는 bash 스크립트를 사용하여 outfile_nXXX.csv
과 filenames 간의 교환을 수행하고 ptally_outfile_nXXX.csv
있지만 더 간단한 작업 흐름을 선호합니다. 감사해요!
답변1
답변2
아니요 sed
, 하지만 매우 우아한 방식입니다.
awk 'NR >= 100013 && NR <= 200013 {print > "ptally_" FILENAME}' outfile_nXXX.csv
새로운 적절한 파일로 일괄 추출하려면 다음을 수행하십시오.
awk 'FNR >= 100013 && FNR <= 200013 {print > "ptally_" FILENAME}' outfile_n*
또는 파일 이름을 다음으로 전달하기 전에 변수에 저장할 수 있습니다 sed
.
filename="outfile_nXXX.csv"
sed -n '100013,200013p' "$filename" > "ptally_$filename"