그래서 좋아요가 file.txt
있어요
John [email protected]
Mary [email protected]
하지만 나도 있어
Pickethunter123 [email protected]
XPC61 [email protected]
GeorgeBushSucks [email protected]
영어 이름 목록이 있어요 names.txt
. 줄의 첫 번째 단어만으로 다른 파일을 grep하는 방법이 있습니까?
답변1
정규식이 패턴 시작 부분에서만 일치하도록 하려면 ^
파일의 각 줄에 줄 앵커를 추가할 수 있습니다 names.txt
. 파일을 현재 위치에서 수정하지 않으려면 다음 명령을 사용하여 즉시 수정할 수 있습니다 sed
.
sed 's/^/^/' names.txt | grep -wf - file.txt
결과를 grep -f
표준 입력 으로 전달합니다 -
.
또는 구분된 데이터의 경우 awk가 좋은 선택입니다.
awk 'NR==FNR{fn[$1]; next} $1 in fn' names.txt file.txt
답변2
이것을 연결하세요당신의더 일찍질문, 콘텐츠가 포함된 JSON 문서가 있는 경우
{"a":"town, state, country","e":["[email protected]"],"n":"john smith"}
{"a":"town, state, country","e":["[email protected]","[email protected]"],"n":"zac surname"}
{"a":"town, state, country","n":"jane doe"}
이름 목록( n
각 키 값의 첫 번째 공백 문자 앞의 값)과 e
값의 이메일 주소를 추출하려면 다음을 사용하는 jq
것이 좋습니다.
jq -r '
select(has("n") and has("e")) |
(.n|split(" ")[0]) as $name |
.e[] | [ $name, . ] | @tsv' file.txt
(바라보다내 이전 답변이 명령에 대한 간략한 설명).
유효한 이름 목록 읽기를 포함하도록 이를 수정할 수 있습니다.
jq -Rs 'rtrimstr("\n") | split("\n") | map(ascii_upcase)' names.txt |
jq -r '
. as $valid_names |
inputs | select(has("n") and has("e")) |
(.n|split(" ")[0]) as $name | select(($name | ascii_upcase) == $valid_names[]) |
.e[] | [ $name, . ] | @tsv' - file.txt
이것은 jq
두 번 호출됩니다. 첫 번째 호출은 names.txt
이름 목록(한 줄에 하나의 이름으로 가정)을 대문자 문자열의 JSON 배열로 변환하는 것입니다.
예를 들어 names.txt
파일에 다음이 포함되어 있는 경우
marty
zac
그런 다음 첫 번째 jq
호출은 JSON 문서를 생성합니다.
[
"MARTY",
"ZAC"
]
두 번째 호출은 첫 번째 호출을 읽고 jq
대문자 이름 목록에서 컬렉션을 만드는 것으로 시작됩니다.$valid_names
그런 다음 이 함수 는 JSON 개체를 하나씩 읽는 inputs
데 사용됩니다 . 나머지는 데이터를 첫 번째 항목으로 만 제한하는 추가 작업을 수행한다는 점을 제외하면 이전 답변에서 수행한 작업과 매우 유사합니다. 이름이 name 과 일치하는 항목 집합 .file.txt
select
$valid_names
names.txt
위 예제의 파일과 file.txt
이 답변의 맨 위에 있는 파일을 사용하면 출력은 한 줄이 됩니다.
zac [email protected]
zac [email protected]
답변3
변환 파일을 사용한 cut
다음 이를 grep
명령에 파이프할 수 있습니다.
cut -d' ' -f1 file.txt | grep -F -f names.txt