2014-11-29 2 views
1

는 욕설과 선을 발견 한 경우awk는 욕설 기호

awk 'BEGIN {FS = "\t"} $1==prev {printf "\t" $2} $1 != prev {printf "\n" $1,$2} {prev=$1}' 

이 끝난 내리는 awk 스크립트를 구문 분석 할 수 없습니다. 아래의 행은 탭 이후에 분리되어 있습니다 (괄호 안에).

Richard Pryor... Here and Now (1983) stand-up 
Richard Pryor... Here and Now (1983) stand-up-comedian 
Richard Pryor... Here and Now (1983) stand-up-comedy 
Richard Pryor: I Ain't Dead Yet, #*%$#@!! (2003) african-american 

오류 탭이 괄호 년 이후 다시

awk: cmd. line:1: (FILENAME=temp.list FNR=4) fatal: arg count with `$' must be > 0 

또 다른 라인 (구문 분석하지 않습니다 다시 포함 욕설)

Merry F#%$in' Christmas (2005) censored-profanity-in-title 

를 얻을.

{printf "\t%s", $2} 
{printf "\n%s\t%s", $1,$2} 

당신이 그것을 사용하는 방법, 당신은 포맷을 형성하기 위해 줄 바꿈과 $ 1 합치하고 있습니다 : 형식 지정자 뒤에 쉼표가 필요 printf :

답변

5

printf 오류가 표시되는 문제를 설명 지정자. $ 1에 포장되지 않은 %이 들어 있기 때문에 printf는 혼란스럽고 오류가 발생합니다.

는 또한, 마지막 행은 줄 바꿈으로 끝나는, 그래서 마지막에이 절을 추가하지 않습니다 :

END {print ""} 
2

@glenn jackmanprintf이 구문 문제의 원인인지 정확합니다.

우아한 방식은 문자열을 구축 연관 배열을 사용하고, 이는 에지 서투른 경우를 피할 :

$ awk -F'\t' '{a[$1]=a[$1] (a[$1]?FS $2:$0)} END{for (k in a) print a[k]}' file 
+0

우아한 용액. 출력의 순서는 랜덤입니다. GNU awk를 사용하면'PROCINFO [ "sorted_in"] = "@ind_str_asc"'를 사용하여 인덱스 값으로 정렬 할 수 있습니다 (https://www.gnu.org/software/gawk/manual/html_node/Controlling-Array- Traversal.html # Controlling-Array-Traversal) –

+1

좋은 팁 @glennjackman 내 기본 가정은 파일이 미리 사전 순으로 정렬되어 있으므로 awk 다음에 정렬하여 동일한 순서를 얻을 수 있습니다. 이 접근법의 또 다른 이점은 파일을 작업 할 때 정렬 할 필요가 없다는 것입니다. –

+0

내가 다루는 파일은 250MB입니다. 그 크기의 배열을 만들고 싶지 않습니다. –