문자와 필드를 동시에 잘라내기

문자와 필드를 동시에 잘라내기

다음과 같은 기록이 있습니다.

2011-05-29 17:51:34 => 'HS|CMGC|RN431|CI13950|CH7-4a37-afe2-acabfc9d262d|DA110529|TI175133|'

최종 출력이 다음과 같기를 원합니다.

2011-05-29 17:51:34  CI13950

다음과 같이 cut을 사용하여 각 부분을 얻을 수 있습니다.

$ cut -c 1-19
2011-05-29 17:51:34
$ cut -d  '|' -f 4
CI13950

두 가지를 결합할 수 없습니다.

$ cut -c 1-19 -d  '|' -f 4
cut: only one type of list may be specified

어떤 제안이 있으십니까?

답변1

한 컷이 제 역할을 합니다. 더 줄이기 위해 두 번 실행할 수도 있지만 cut다음과 같은 것을 사용해야 할 것 같습니다.awk, sed또는 perl대신.

여러 실행의 예 cut:

cut -f 2 | cut -c 3-6

사용 예는 perl데이터 라인에서 작동합니다.

perl -pne "s/=> '([^|]+\|){3}([^|]+)/\2/g"

sed댓글에 있는 Fred의 버전 은 다음과 같습니다 .

sed -re "s/=> ([^|]*\|){3}([^|]*).*/\2/"

답변2

awk '{split($NF,x,"|"); print $1, $2, x[4]}'

답변3

이 문제는 다음과 같습니다이상하게도 친숙한, 하지만 실제로는 그것이 먼저라고 생각합니다.

내가 본 가장 간단하고 읽기 쉬운 방법은 다음과 같이 Awk를 사용하는 것입니다.

awk -F'|' '{print substr($0,1,19), $4}' text.txt

이것은정확히cut -c 1-19 -d '|' -f 4작동 코드라는 점을 제외하면 시도한 명령과 동일합니다 . ;)

관련 정보