다음과 유사한 내용이 포함된 .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