2017-01-12 2 views
1

40 개 정도의 디렉토리가 있습니다. 각각의 CSV 파일에는 꼭 필요하지 않은 맨 위에 추가로 10 줄이 있습니다. 나는 명령을 강타 할 새로운 해요,하지만 난 한 번에 파일 한 10 선을 잘라bash를 사용하여 여러 CSV 파일의 줄 자르기

tail -n +10 oldfile.csv > newfile.csv 

를 사용할 수있는 것으로 나타났습니다. 디렉토리에있는 모든 CSV에서이 작업을 수행하려면 어떻게해야합니까? 나는이 일을 시도 : 내가 읽은 바로는

for filename in *foo*; do echo tail -n +10 \"$filename\" > \"${filename}\"; done 

, 나는이, 이름에 foo는를 포함하는 모든 CSV에 전달하는 공식을 실행하고 혼자 파일 이름을 떠날 것이라고 생각했다. 내가 어디로 잘못 가고 있니?

답변

1

다음과 같이 적절한 루프를 사용하십시오. Vim이 내부적으로 내부 대체에 사용하는 기본 ex 편집기를 사용하고 있으므로 mv 또는 다른 명령을 사용하여 파일을 다시 이동하지 않아도됩니다.

for file in *.csv 
do 
    ex -sc '1d10|x' "$file" 
done 

첫번째 행으로 이동 명령은, 제 10 개 행을 선택하여 삭제하고 & 파일을 닫고 저장한다.

for file in *.csv; do ex -sc '1d10|x' "$file"; done 

ex 명령 POSIX compatible하고 모든 주요 플랫폼과 배포판에서 작동 수있는 한 줄에 명령 줄 친화적 인 버전을 사용합니다.

+0

입니다. 감사! – James

2

입력 및 출력과 같은 파일을 사용할 수 없습니다. SED와

, 당신은 -i 플래그와 장소에서 파일 을 편집 할 수 있습니다

for f in *.csv; do 
    sed -i '1,10d' "$f" 
done 

또는 명령 행에 대한 한 라이너 : 보조 노트로

for f in *.csv; do sed -i '1,10d' "$f"; done 

, 파일 끝에 11 행을 출력하려면 tailtail -n +11이어야합니다. AWK에서

+0

이것을 실행할 때 "잘못된 명령 코드"오류가 발생합니다. 필자가 실행하는 방식은 디렉토리에 대한 'cd'입니다.CSV; [Enter],> sed -i '1,10d' "$ f"[Enter],> done [Enter] .. $ ..로 돌아가서 무효 명령 코드 – James

+0

Multiline은 스크립트를위한 것입니다. 명령 줄에 한 줄짜리 줄을 추가했습니다. – SLePort

+0

작동! 하지만 ... '-i와 '110d'사이에 ''를 추가해야합니다 .. credit : http://stackoverflow.com/questions/29081799/sed-1-invalid-command-code-f (저는 Mac에서). 결승전 : f 인 경우 * .csv; sed -i '' ''1,10d ' "$ f"; done – James

0

:

$ awk 'FNR>10{ print > "new-" FILENAME }' files* 

는 설명 :

  • FNR>10 현재 파일에 현재 레코드 번호가 10보다 큰 경우, 조건이 참입니다. 잘
  • print, 출력 예를 들어 new-file라는 이름의 새 파일
  • > "new-" FILENAME 리디렉션 출력.

을 여러 파일에 출력합니다. 화면에 방금 출력 된 원본은 awk 'FNR>10' files*

+1

하지만 파일에 저장합니까? – codeforester

관련 문제