어디서나 두 개의 문자열을 포함하는 파일에서 모든 줄을 추출합니다.

어디서나 두 개의 문자열을 포함하는 파일에서 모든 줄을 추출합니다.

다음과 유사한 내용이 포함된 .txt 파일이 있습니다.

  • 100 150 180 200 300 400
  • 100 200 250 350 380 400
  • 100 160 170 400 450 500
  • 100 120 140 160 180 200
  • 100 120 140 160 180 300

"100" 및 "200"이 포함된 특정 열(예: 2, 3 또는 기타 열)에서 시작하여 모든 행을 가져온 다음 다른 별도의 txt 파일로 출력하고 싶습니다. 어떻게 해야 하나요? 위의 예에서 올바른 인쇄는 다음과 같습니다.

  • 100 150 180 200 300 400
  • 100 200 250 350 380 400
  • 100 120 140 160 180 200

Sublime의 "모두 찾기" 기능을 사용한 다음 줄 끝의 오른쪽 화살표를 사용하여 강조 표시해 보았지만 불행하게도 일부 줄은 다른 줄보다 훨씬 길어서 작동하지 않습니다.

답변1

$ grep 100 <file | grep 200 >newfile
$ cat newfile
100 150 180 200 300 400
100 200 250 350 380 400
100 120 140 160 180 200

첫 번째는 grep원본 파일에서 문자열을 포함하는 모든 줄을 추출합니다 100. 두 번째는 grep모든 행을 추출합니다.그 결과로문자열을 포함합니다 200.

이 행에는 원하는 문자열이 하위 문자열로 포함되어 있으므로 1100및 와 같은 문자열이 포함된 행도 추출됩니다 . 1200이를 방지하려면 가능한 경우 옵션 grep과 함께 사용하세요.-w


특정 열에서만 시작을 테스트하려면 짧은 awk프로그램을 사용하십시오.

$ awk -v col=1 '{ delete c; for (i=col; i<=NF; ++i) ++c[$i]; if (c[100] > 0 && c[200] > 0) print }' <file >newfile
$ cat newfile
100 150 180 200 300 400
100 200 250 350 380 400
100 120 140 160 180 200

프로그램 awk은 명령줄에서 변수 값을 가져옵니다 col(여기서 값은 1입니다). 그런 다음 열에서 시작하여 각 입력 행을 반복하여 col각 값이 발생하는 횟수를 계산합니다. 값 합계가 0회 이상 100발생 하면 해당 행을 인쇄합니다.200

이 프로그램은 더 나은 레이아웃을 가지고 있습니다:

{
    delete c

    for (i=col; i<=NF; ++i)
        ++c[$i]

    if (c[100] > 0 && c[200] > 0)
        print
}

이 프로그램은 다음 명령을 사용하여 줄을 추출하는 데에도 적합합니다.특정한특정 항목에 대한 일치 수입니다.

답변2

오탐지가 발생하지 않을 것이라고 확신하는 경우 다음을 시도해 볼 수도 있습니다.

awk '{TMP = $0; sub ($1 FS $2, "")} /100/ && /200/ {print TMP} ' file

관련 정보