여러 csv 파일에 대한 grep 명령 루프와 관련된 문제

여러 csv 파일에 대한 grep 명령 루프와 관련된 문제

아래와 같이 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(성공)을 반환하는 경우에만 실행됩니다.

추가 팁:

  1. -loops for를 하나로 결합할 수 있습니다.
  2. 키워드는 -loop일 수 for있으며 파일 루프와 중첩될 수 있습니다.
  3. 먼저 디렉터리를 만들고 건너뛰도록 출력을 직접 리디렉션합니다.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식입니다.

관련 정보