입력.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