![패턴 파일이 포함된 줄을 추출하여 다른 파일 grep, sed, awk, print에 저장합니다.](https://linux55.com/image/152483/%ED%8C%A8%ED%84%B4%20%ED%8C%8C%EC%9D%BC%EC%9D%B4%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%EC%A4%84%EC%9D%84%20%EC%B6%94%EC%B6%9C%ED%95%98%EC%97%AC%20%EB%8B%A4%EB%A5%B8%20%ED%8C%8C%EC%9D%BC%20grep%2C%20sed%2C%20awk%2C%20print%EC%97%90%20%EC%A0%80%EC%9E%A5%ED%95%A9%EB%8B%88%EB%8B%A4..png)
이 파일이 있어요
- . ID = tom_fa_10005086
- 0 Parent = tom_fa_10005086
- 0 Parent = tom_fa_10005086
- 2 Parent = tom_fa_10005086
- 1 Parent = tom_fa_10005086
- 0 Parent = tom_fa_10005086
- 0 Parent = tom_fa_10005086
+ . ID = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
+ 1 Parent = tom_fa_10013928
+ 1 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
- . ID = tom_fa_10000024
- 0 Parent = tom_fa_10000024
- . ID = tom_fa_10004587
- 0 Parent = tom_fa_10004587
- 1 Parent = tom_fa_10004587
그리고 이러한 패턴은
COL 1
tom_fa_10005086
tom_fa_10013928
tom_fa_10000024
tom_fa_10011338
tom_fa_10003474
패턴이 라인과 일치하면 라인을 추출하여 파일로 저장하고 싶습니다.
그런데 150개의 패턴이 있는데 각 일치 항목을 다른 파일에 저장해야 합니까? 따라서 150개의 패턴이 있으면 150개의 출력 파일이 있게 됩니다.
결과는 다음과 같습니다.
파일 1
- . ID = tom_fa_10005086
- 0 Parent = tom_fa_10005086
- 0 Parent = tom_fa_10005086
- 2 Parent = tom_fa_10005086
- 1 Parent = tom_fa_10005086
- 0 Parent = tom_fa_10005086
- 0 Parent = tom_fa_10005086
파일 2
+ . ID = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
+ 1 Parent = tom_fa_10013928
+ 1 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
파일 3…
나는 생각 중입니다:
grep -f 파일1 파일1 ....
grep -E
답변1
주어진 patterns
파일:
$ cat patterns
tom_fa_10005086
tom_fa_10013928
tom_fa_10000024
tom_fa_10011338
tom_fa_10003474
그 다음에
awk 'NR==FNR{a[$1]=NR; next} $NF in a {print > "outfile" a[$NF]}' patterns file
결과는 다음 파일입니다.
$ head outfile?
==> outfile1 <==
- . ID = tom_fa_10005086
- 0 Parent = tom_fa_10005086
- 0 Parent = tom_fa_10005086
- 2 Parent = tom_fa_10005086
- 1 Parent = tom_fa_10005086
- 0 Parent = tom_fa_10005086
- 0 Parent = tom_fa_10005086
==> outfile2 <==
+ . ID = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
+ 1 Parent = tom_fa_10013928
+ 1 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
==> outfile3 <==
- . ID = tom_fa_10000024
- 0 Parent = tom_fa_10000024
답변2
target.txt
첫 번째 큰 파일의 이름은 이고 두 번째 작은 파일의 이름은 이라고 가정해 보겠습니다 source.txt
.
tail +3 source.txt | while IFS= read -r line; do grep "$line" target.txt > "$line"; done
설명하다
tail +3 source.txt
: 처음 두 줄 삭제source.txt
| while IFS= read -r line; do <FOO>; done
: 이 잘린 파일을while read
구문에 파이프합니다. 이는 truncated 의 각 행을 반복하여source.txt
각<FOO>
행에 대해 작업을 수행합니다.grep "$line" target.txt > "$line"
: 각source.txt
줄에 대해 에서 찾은target.txt
다음 검색한 원래 문자열과 동일한 이름을 가진 파일에 씁니다.
작은 설명: source.txt
실제로 패턴 대신 고정 문자열이 포함된 경우 사용할 수 있는 -F
옵션 입니다 grep
.