2014-10-08 2 views
0

필드에 포함 된 공백을 허용하면서 awk로 특정 필드를 인쇄하는 간단한 방법을 찾고 있습니다.AWK로 포함 된 공백 무시

샘플 : Field1 Field2 "Field Three" Field4 나는 하나의 필드하지 두로 awk '{print $3}'하지만 점점 "필드 세"에 해당하는 작업을 수행 할 수 있도록하려는

.

업데이트 : 좀 더 구체적으로 말하면, 나중에 $ 3이 아닌 필드를 가져야하지만, # 3의 공간은 상황을 망칠 것입니다. $ 3에있는 따옴표 사이의 공백 수는 가변적입니다. 나는 모든 필드가 따옴표로 묶여 있지 않더라도 따옴표 사이를 단일 필드로 처리 할 수 ​​있기를 원합니다. 따라서 따옴표 사이의 경우 필드 구분 기호로 공백을 무시하십시오.

awk -F\" '{print $2}' 

는 특히, 나는 필드가있는 당신이 원하는 부분을 필드로 쉽게 사용할 수 가리 따옴표로 구분되어 awk 말하고있다 : 따옴표가 항상있을 경우

답변

1

이 작업을 수행 할 수 있습니다 2.

후속 필드에서 얻을 필요가 있다면, 당신은 공간에있는 라인의 나머지를 분할하여 새 배열을 얻을 수 있습니다, 다음과 같이 필드의 F[] 말 :

awk -F\" '{split($3,F," ");print $2,F[1],F[2]}' file 

Field Three Field4 Field5 
파일을 가정

은 다음과 같습니다

Field1 Field2 "Field Three" Field4 Field5 Field6 
+0

예이 루비 예를 들어, 큰 따옴표, 주어진 라인을 구문 분석 열 구분 기호로 공간을 사용하고 기본 인용 문자 정확히 3 번 필드를 제공하지만 나중에 필드를 가져올 수는 없습니다. –

+0

나중에 필드를 원한다는 것을 알지 못했습니다. 나는 그것에 대처하는 방법을 추가 했으니 다른 모습을 보여주십시오. –

+0

굉장합니다. 그게 내가 필요로하는 속임수를 제공하고 실제 데이터를 조정할 수있었습니다. (27 칸, 공백이있는 배수). [편집증 환자가되어서 죄송합니다.] 도움을 주셔서 감사합니다 !! –

0

사전에 당신이 얼마나 많은 임베디드 따옴표를 모르는 경우가 작동하지 않습니다 (그리고에 분할하지 않지만 마크 Setchell의 대답은, 좋은 공백).

나는 (분명히 향상시킬 수있다) 함께이 해킹 :

gawk -v FIELD=2 '{ a=$ FIELD; if (substr(a, 0, 1) == "\"") { gsub(/^\"/, "", a); s=a; for (i = FIELD + 1; i <= NF; i++) { a=$ i; nbSub=gsub(/\"$/, "", a); s = s " " a; if (nbSub > 0) { break } } print(s) } }' <<<'allo "hello world" bar' 

내가 (아마도 쉘의 IFS 변수로 필드를 구문 분석 들여다?)이 대한 둔한 것보다 다른 것을 사용하는 것이 좋습니다 것입니다.

부록 : 위에서 말했듯이 이것은 실제로 작업에 적합한 도구는 아닙니다. 예를 들어, -v FIELD =로 첫 번째 필드를 지정할 수 있지만 AWK의 구분 기호를 기반으로 필드를 계산합니다 (포함 된 공백은 여전히 ​​계산됩니다).

+0

입력 해 주셔서 감사합니다. 그러나 이들 중 아무 것도 도움이되지 않습니다. 어쩌면 전반적인 목표에 대해 명확하지 않을 수 있습니다. (질문을 간단하게 유지하려고 시도했습니다.) 좀 더 구체적으로 말하면, $ 3이 아닌 나중의 필드를 가져야하지만 $ 3의 공간은 문제를 일으키는 것입니다. $ 3에있는 따옴표 사이의 공백 수는 가변적입니다. 나는 모든 필드가 따옴표로 묶여 있지 않더라도 따옴표 사이를 단일 필드로 처리 할 수 ​​있기를 원합니다. 따라서 따옴표 사이의 경우 필드 구분 기호로 공백을 무시하십시오. 다른 아이디어가 있습니까? 이것은 분명히 내가 바라는 것이 더 어렵습니다. –

1

this을 바탕으로 gawk에 어쩌면 당신은

awk 'BEGIN{FPAT = "([^ ]+)|(\"[^\"]+\")"}{print $3}' input.txt 

출력 같은 것을 사용할 수 있습니다

"Field Three" 

그것은 완전히 당신의 요구에 적합한 얻기 위해 더 많은 일을해야 할 수도 있습니다.

나는이 까다로운 비즈니스가 될 수 gawk 4+, https://lists.gnu.org/archive/html/info-gnu/2011-06/msg00013.html

+0

이것은 기본 {print $ 3}과 똑같은 효과가있는 것 같습니다. 나는 # 3의 첫 1/2을 얻는다. –

+0

@ Chris-9090의 경우 gawk에만 해당되며 버전 4 이상이 필요합니다. GNU awk ('gawk') 또는 다른 구현을 사용하고 있습니까? 어떤 구현을 사용하고 있는지 보려면'awk --version'을 시도해보십시오. 이 작업을하려면'GNU Awk 4.1.0, API : 1.0'과 같은 것이 출력되어야합니다. – Ashkan

1

구문 분석 CSV 필요하다고 생각. 적절한 CSV 구문 분석 모듈로 언어를 사용하고 싶습니다.

ruby -rcsv -ne 'row = CSV.parse_line($_, {:col_sep=>" "}); puts row[2]' <<END 
Field1 Field2 "Field Three" Field4 
END 
Field Three 
+0

죄송 합니다만,이 시스템에서는 Ruby에 액세스 할 수 없습니다. –

0

마크 Setchell의 솔루션은 나를 위해 최고의 근무 :

awk -F\" '{split($3,F," ");print $2,F[1],F[2]}' file