파일에서 한 줄의 첫 번째 단어를 Grep합니다.

파일에서 한 줄의 첫 번째 단어를 Grep합니다.

그래서 좋아요가 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.txtselect$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

관련 정보