2013-11-04 2 views
1

필드가 여러 문자로 구분 된 파일이 있습니다. 예 :AWK를 사용하는 우아한 방법

abc sometext def;ghi=123; 
abc sometext def;ghi=123; 
abc sometext def;ghi=123; 

이제 AWK로 파일을 구문 분석하여 필드를 추출하고 싶습니다. 예 'GHI'의 모든 값을 얻을 수 있도록

awk '{print $3}' | awk 'BEGIN {FS = "="} { print $NF }' inputFile.txt 

한 샷 대신 여러 파이프 및 AWK 명령을 사용하여에서 파일을 구문 분석 할 수있는 방법이 있습니까.

답변

1

이도 수행 할 수 있습니다 awk에서 여러 필드 분리를 사용하여 :

$ awk -F"[=;]" '{print $3}' file 
123 
123 
123 

이 필드 분리를 사용하는 awk을 알려줍니다 = 또는 ;. 그것을 바탕으로, 당신이 원하는 숫자는 3 위치에 있습니다. 당신이 ghi 일부 변경 및 중요한 것으로 예상되는 경우

, 당신은 또한보고 숨김과 grep을 사용할 수 있습니다 :이 ghi= 후 모든 숫자를 인쇄합니다

$ grep -Po '(?<=ghi=)\d+' file 
123 
123 
123 

.

+0

그의 예제는';'을 제거하지 않습니다. 여러 분리 기호를 사용하는 다른 방법'awk -F "= |" '{print $ 3}'file ' – Jotne

+0

예, @Jotne,하지만 그것은 달성하기 좋은 것 같아요. 그리고 저는이'-F "= |"'가 띄어 보입니다. 단 두 개의 구분 기호가있을 때 깔끔하게 보입니다. – fedorqui

+0

그리고'' – Jotne

2

예, 배열 a에 세퍼레이터로서 =를 사용하여이 3 NR 출원 제산 awk

awk '{split($3,a,"=");print a[2]}' 
123; 
123; 
123; 

split 함수를 사용하여, 다음 배열 a[2]


의 제 2 값을 출력 필드 3에 필드가 다양하고 마지막으로 좋아하는 필드가있는 경우 다음과 같이하십시오.

귀하의 경우에는
awk '{n=split($3,a,"=");print a[n]}' 
123; 
123; 
123; 

이 너무 할 것입니다 :

awk -F= '{print $NF}' 
+0

감사합니다. 이 파싱 방법은 쉽고 우아 해 보입니다. – gthm

+0

자세한 정보로 업데이트되었습니다. 만약 당신이 그것을 좋아한다면, 그것을 받아 들일 수 있습니다 :) – Jotne

관련 문제