sed를 사용하여 파일을 편집하고 결과를 원래 파일 이름을 기반으로 한 파일 이름으로 다른 파일에 저장합니다.

sed를 사용하여 파일을 편집하고 결과를 원래 파일 이름을 기반으로 한 파일 이름으로 다른 파일에 저장합니다.

일반 파일 이름 패턴을 사용하여 길이가 ~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

단일 파일에 대해 이 작업을 수행하지만 대규모 파일 배치를 자동화하는 방법이 필요합니다. -ised의 옵션을 사용하여 이를 달성 할 수 있습니다 .

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

루프를 사용하세요 for.

for f in outfile_n???.csv; do
  sed -n '100013,200013p' "$f" > ptally_"$f"
done

또는 특정 실제 요구 사항에 따라 다음을 사용하는 것이 더 적절할 수 있습니다.csplit. 일부GNU 확장그 힘을 크게 확장하십시오.

답변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"

관련 정보