여러분, 문제가 생겼습니다.
샘플 데이터가 있습니다
2021-04-15 07:47:34 629 deveon3/10d/023aad3eab0a035aef3771c9220940e200a00000000242e5_0.gt
나만 필요해
023aad3eab0a035aef3771c9220940e200a00000000242e5
나는 노력한다
grep _0.gt test.txt | sed "s/.* \(.*\) \(...\)\/\(.*\)_0.gt/\1|\2|\3/g" > test.dat
하지만 결과는 같고 차이는 없습니다.
내가 찾고 있는 것은 내가 갖고 있는 것입니다.
2018-10-20 19:34:23 1668004 000/02001386c62785e42231c679c614228a04000090022ff989_0.gt
2018-10-20 21:18:58 1694936 000/02001386c62785e72231c679c614228a040000000232d761_0.gt
2018-10-20 23:59:40 1828575 000/020057386c6278e72231c679c644228a04000000023696fb_0.gt
출력 받기
1668004|000|02001386c62785e72231c679c614228a04000000015528dd
1694936|000|02001386c62785e72231c679c614228a040000000166bca7
1828575|000|02001386c62785e72231c679c614228a04000000022f8f33
그렇지 않으면
02001386c62785e72231c679c614228a04000000015528dd
02001386c62785e72231c679c614228a040000000166bca7
02001386c62785e72231c679c614228a04000000022f8f33
내가 뭘 잘못했나요?
답변1
awk -F'[_/ ]+' '{ print $5 }' infile
awk -F'[_/ ]+' -v OFS="|" '{ print $3, $4, $5 }' infile
답변2
각 행에서 공백으로 구분된 마지막 필드와 네 번째 필드 /
사이에 데이터가 필요하다고 가정해 보겠습니다._
$ awk '{ sub(".*/","",$4); sub("_.*","",$4); print $4 }' file
02001386c62785e42231c679c614228a04000090022ff989
02001386c62785e72231c679c614228a040000000232d761
020057386c6278e72231c679c644228a04000000023696fb
sub()
이는 네 번째 필드의 마지막 필드 /
앞뒤에 나타나는 모든 항목을 자르는 데 두 번 사용됩니다 _
. 그런 다음 필드의 나머지 내용을 인쇄합니다.
대체를 사용 하고 다른 문자 sed
가 없다고 가정합니다./
뒤쪽에우리가 관심을 갖는 데이터:
$ sed 's|.*/||; s/_.*//' file
02001386c62785e42231c679c614228a04000090022ff989
02001386c62785e72231c679c614228a040000000232d761
020057386c6278e72231c679c644228a04000000023696fb
세 번째 필드에서 더 많은 정보를 얻고 구분 기호를 로 변경하려면 다음과 같이 사용할 |
수 있습니다 .awk
$ awk -v OFS='|' '{ gsub("/",OFS,$4); sub("_.*","",$4); print $3,$4 }' file
1668004|000|02001386c62785e42231c679c614228a04000090022ff989
1694936|000|02001386c62785e72231c679c614228a040000000232d761
1828575|000|020057386c6278e72231c679c644228a04000000023696fb
/
네 번째 필드의 모든 항목을 무엇이든 변경하는 것부터 시작합니다 OFS
(출력 필드 구분 기호이므로 |
명령줄에서 설정했습니다). 그런 다음 뒤따르는 모든 항목을 잘라내고 이전과 같이 _
세 번째 및 수정된 네 번째 필드를 인쇄합니다 .
여기 있습니다. sed
약간 어색하긴 하지만 작동합니다.
$ sed 's/\([^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)\{2\}//; s/_.*//; y/\/ /||/' file
1668004|000|02001386c62785e42231c679c614228a04000090022ff989
1694936|000|02001386c62785e72231c679c614228a040000000232d761
1828575|000|020057386c6278e72231c679c644228a04000000023696fb
-E
또는 확장 정규식을 사용하려면 비표준 옵션을 사용하세요 .
$ sed -E 's/([^[:blank:]]+[[:blank:]]+){2}//; s/_.*//; y/\/ /||/' file
1668004|000|02001386c62785e42231c679c614228a04000090022ff989
1694936|000|02001386c62785e72231c679c614228a040000000232d761
1828575|000|020057386c6278e72231c679c644228a04000000023696fb
먼저 처음 두 개의 필드와 그 뒤의 공백을 제거한 다음 삭제합니다 _
. 마지막으로 모든 공백 및 /
를 로 변경합니다 |
.