아래와 같이 for 루프 스크립트를 만들었습니다.
for file in *.csv
do
grep raxA $file > new_${file}
done &&
mkdir raxA && mv new_* raxA &&
for file in *.csv
do
grep raxB $file > new_${file}
done &&
mkdir raxB && mv new_* raxB &&
for file in *.csv
do
grep raxC $file > new_${file}
done &&
mkdir raxC && mv new_* raxC
이 스크립트는 모든 키워드가 다음에서 발견될 때 작동합니다.데이터 세트파일이지만 파일에서 키워드 중 하나라도 누락되면 실패합니다.데이터 세트문서. 이 일을 완료하도록 도와주실 수 있나요?grep지정된 키워드가 csv 파일에서 누락되었습니다. 미리 감사드립니다.
답변1
비슷한 것을 원하는 것 같습니다.
mkdir -p raxA raxB raxC &&
awk '
/raxA/ {print > ("raxA/new_"FILENAME)}
/raxB/ {print > ("raxB/new_"FILENAME)}
/raxC/ {print > ("raxC/new_"FILENAME)}' ./*.csv
답변2
문제는 명령 뒤에 &&
AND() 연산자를 사용하여 명령을 연결하는 것 입니다 grep
. grep
의 종료 상태를 확인하세요 .
에서 man grep
:
종료 상태
일반적으로 종료 상태는 행이 선택된 경우 0, 행이 선택되지 않은 경우 1, 오류가 발생한 경우 2입니다.
종료 상태가 1이면 다음 명령이 실행되지 않습니다. 바라보다man bash
명령 1 && 명령 2
command2는 command1이 종료 상태 0(성공)을 반환하는 경우에만 실행됩니다.
추가 팁:
- -loops
for
를 하나로 결합할 수 있습니다. - 키워드는 -loop일 수
for
있으며 파일 루프와 중첩될 수 있습니다. - 먼저 디렉터리를 만들고 건너뛰도록 출력을 직접 리디렉션합니다.
mv
답변3
다른 사람들이 이미 명령의 문제점을 지적했기 때문에 쉘 루프를 사용하여 이를 수행하는 대체 방법을 제안합니다.피해야한다.
awk
패턴을 검색하고 일치하는 각 패턴을 여러 파일로 분할할 수도 있습니다 .
awk '{ matched=match($0, /rax[ABC]/); };
matched{ dirname=substr($0, RSTART, RLENGTH);
system("mkdir -p " dirname);
print >(dirname"/new_"FILENAME);
matched=0;
}' infile
바라보다man awk
~을 위한match()
,substr()
,system()
기능.
파일이 .csv로 나타나고 전체 행이 아닌 특정 열에서 패턴을 찾으려면 -F,
명령에 추가하고(입력 파일에 대한 필드 구분 기호 지정) 를 로 바꾸십시오 $0
( 의 전체 행을 나타냄 awk
). csv 파일의 해당 열 번호가 일치합니다. 예를 들어 패턴과 일치하는 첫 번째 열이 사용되고 $1
, 두 번째 열이 사용되고 $2
, 세 번째 열이 사용되는 $3
식입니다.