패턴 매칭 후 단어를 추출하는 방법

패턴 매칭 후 단어를 추출하는 방법

입력.txt

abc1 abc2 {"request":{"jjj":"opt1"},"user":{"name":"abc5"}}
xyz1 xyz2 {"request":{"xyz3":{"xyz4":{"xyz5":"xyz6"}},"jjj":"opt2"}}
ghi1 ghi2 {"request":{"ghi3":{"ghi4":{"ghi5":"ghi6"}},"jjj":"opt3"},"user":{"ghi7":"value"}}

처음 두 필드와 일치하는 문자열 뒤의 단어를 출력해야 합니다.jjj

abc1 abc2 opt1
xyz1 xyz2 opt2
aaa1 aaa2 opt3

답변1

액세스 권한이 있는 경우 sed정규식을 사용하여 세 번째 열에서 필요한 부분을 추출하고 나머지는 변경하지 않고 그대로 둘 수 있습니다.

sed 's/{.*"jjj":"\([^"]*\).*$/\1/g' input.txt

input.txt파일에는 다음이 포함됩니다.

abc1 abc2 {"abc3":{"jjj":"opt1"}}
xyz1 xyz2 {"xyz3":{"jjj":"opt2"}}
aaa1 aaa2 {"aaa3":{"aaa4:"jjkk"},.....{"jjj":"opt3"}}

"jjj":"여기서는 다음 닫는 큰따옴표 앞과 뒤의 큰따옴표에 있는 값을 캡처하려고 합니다 .

답변2

$ awk '
{
  print $1, $2, \
   substr($0, 8+match($0, /\{"jjj":"[^"]+"/), RLENGTH-9)
}' input.txt
abc1 abc2 opt1
xyz1 xyz2 opt2
aaa1 aaa2 opt3

답변3

세 번째 필드는 유효한 JSON인 것으로 보이므로 다음을 사용하는 것이 좋습니다 jq.

$ awk -v cmd='jq -r ".. | .jjj? // empty"' '
  {printf "%s%s%s%s",$1,OFS,$2,OFS; print $3 | cmd; close(cmd)}
' file
abc1 abc2 opt1
xyz1 xyz2 opt2
ghi1 ghi2 opt3

답변4

파일의 세 필드가 모두 탭으로 구분되어 있다고 가정합니다.

$ cut -f 3 file | jq -r '.request.jjj' | paste <( cut -f -2 file ) -
abc1    abc2    opt1
xyz1    xyz2    opt2
ghi1    ghi2    opt3

이는 각 행의 세 번째 필드에서 JSON 구조를 추출하고 이를 전달하여 jq각 필드의 키 값을 추출합니다 .request.jjj. 그런 다음 해당 데이터를 세 번째 열에 다시 붙여넣는 데 사용합니다 paste.

데이터가 단일 공백 ​​문자로 구분된 경우:

$ cut -d ' ' -f 3- file | jq -r '.request.jjj' | paste -d ' ' <( cut -d ' ' -f -2 file ) -
abc1 abc2 opt1
xyz1 xyz2 opt2
ghi1 ghi2 opt3

cut데이터를 자르는 공백 문자가 포함되어 있지 않은지 확인하는 것 -f 3-뿐만 아니라 JSON 구조를 추출하는 첫 번째 방법을 사용해야 합니다 .-f 3

관련 정보