주어진 작업: head와 tail을 사용하여 파일의 두 번째 부분(즉, 데이터 부분)을 추출하는 명령을 작성합니다.
*찾은 내용: tail -n 52 (path) | head -n 51
은 이 부분을 추출하기 위한 올바른 head 및 tail 명령을 제공합니다.
extractdata라는 실행 가능한 스크립트로 변환합니다. 그런 다음 find 및 extractdata를 사용하여 월 디렉터리에 있는 모든 .csv 파일의 두 번째 부분을 가져오고 출력을 polls.csv라는 파일에 저장하는 명령을 작성합니다.
*지금까지 나는 다음을 수행하는 방법을 알아냈습니다. vim extractdata
데이터 추출 시:
#!/bin/sh
#----------------------------------------------------------------------------
#A script used to extract the second section of a file (i.e. the data section)
#----------------------------------------------------------------------------
echo "Hello $USER."
tail -n 52 $1 | head -n 51
다음에 수행할 작업과 이 스크립트를 실행하는 방법이 혼란스럽습니다. 실행 가능하도록 chmod 755를 사용하여 권한을 변경했지만 프로세스에서 다음에 무슨 일이 일어나는지 모르겠습니다.
(편집하다): 제가 만든 스크립트를 실행하는 방법을 알아냈고 다음 명령을 사용하면 예상대로 작동합니다.
./extractdata/filepath/file.csv
이제 월 디렉토리에 있는 모든 .csv 파일을 가져와서 polls.csv라는 파일에 넣는 방법 중 이 부분에서 막혔습니다.
(편집하다): extractdata 스크립트에 > polls.csv를 추가하면 예상대로 head 및 tail 명령이 polls.csv에 저장됩니다. 이제 파일 경로 디렉터리의 모든 .csv 파일에 대해 이 명령을 실행하는 방법을 알아내면 됩니다.
(업데이트): 모든 .csv 파일에서 추출된 데이터를 polls.csv 파일에 추가하는 작업을 처리하는 스크립트에 루프를 추가할 수 있는 방법이 있습니까?
답변1
find . -iname '*.csv' | xargs -I {} tail -n 52 "{}" \| head -n 51 > polls.csv
하지만 head와 tail 대신 grep을 사용해야 합니다.
답변2
스크립트를 사용하지 않고도 find의 -exec 기능을 사용하여 이 작업을 수행할 수 있습니다.
for i in $(ls months)
do
find . -name \*.csv -exec tail -n 52 {} | head -n 51 >> /absolutePath/polls.csv \;
done