2014-11-25 1 views
0

awk를 사용하여 두 가지 작업을 수행하려고합니다. 목록을 세 개의 개별 목록으로 분리하고 각각의 1 또는 2 열을 정규 표현식으로 변환하려고합니다. awk를 파이프에 연결할 때, 즉 내 목록에서 내 항목을 선택한 다음 awk을 사용하여 대체를 수행하면 목록 항목에 1이 추가됩니다.awk에서 운영 명령?

나는 그림을 awk에 파이프하지 말고 대신 awk에 대한 단일 호출에서이 모든 작업을 수행해야한다.

AH??0*,*,ARRAY RESISTIVITY,RESISTIVITY 
AHD*,*,MEASURED DEPTH,REFERENCE 
AI*,*,ACOUSTIC IMPEDANCE COMPRESSIONAL,GEOPHYSICAL SYNTHETICS 
AI_AVG_HOR_SIG,*,ACOUSTIC IMPEDANCE,ACOUSTIC 
*,FOO,BAR,BLEH 

목록 하나 2.

에서 두 개의 별도의리스트 라인 2 및 3에 대한 것이다 열에서 와일드 카드를 교체 열에 하나의 와일드 카드와 라인 (4)와 같은 라인 것 1 열과 2 열을 대체해야합니다.

마지막으로, 별도의 목록에서 5 행에 대해 비슷한 작업을 수행해야합니다.

이 목록을 가져올 수 있습니다.

4 호선 : awk -F \, '$1!~/([\*\?])/' file.txt
라인 1-3 : awk -F \, '$1~/([\*\?])/' file.txt
5 호선 : awk -F \, '$1~/^\*$/' file.txt

내 잠수정은 * => *합니다.? => [0-9].

awk -F \, 'gsub(/\*/,".*",$2) $1!~/([\*\?])/' OFS=, file.txt과 같이 gsub를 사용하려고하면 예기치 않은 결과가 나오는 펑키 목록이 다시 나타납니다. 스태킹 작업과 관련하여 awk에 대해 이해할 수없는 근본적인 것이있는 것처럼 느껴집니다.

하프!

+2

액션 블록에 'gsub'를 넣어야합니다. '{gsub (...)} '. 지금 그것은 하나의 패턴입니다. 따라서 작업을 수행 한 다음 awk가 현재 행을 인쇄하도록 지시합니다. '$ 1 ~ .... '패턴이 일치 할 때만 gsub를 원한다면 그 패턴에 대한 액션 블록에 gsub을 넣고 싶을 것이다 (그리고'print'도 추가해야 할 것이다). –

+0

그건 나를 위해 일했습니다. 내가 지금 가지고있는 유일한 문제는 이것이다. awk -F \, '$ 1 ~/[\ * \?]/&& $ 1! ~/^ \ * $ /'{gsub (/\*/,".* ", $ 1); gsub (/ \? /, "[0-9]", $ 1); gsub (/\*/,".*",$ 2); print} OFS =, file.txt' 오류가 발생합니다. 두 정규식 비교를하고 있기 때문에 가능성이 높습니다. 그 문제를 해결하는 방법을 모릅니다. – juanschwartz

+2

awk 스크립트 (작은 따옴표로 묶은 문자열)를 너무 일찍 종료했습니다. 작은 따옴표는'$ 1! ~/^ \ * $ /'다음이 아닌 마지막'; print}'뒤에 있어야합니다. –

답변

1

여기 작성한 것은 귀하의 질문에 대한 해결책이 아닙니다. 버전을 재구성하는 것입니다. (완료하려면 :). @Etan 현명한 제안 중 일부가 여전히 누락되었습니다. (문체적인 관심은 우리에게 많은 시간을 절약 해줍니다.)

awk (또는 모든 일회용 솔루션)이 혼동을 일으켜 약 30자를 초과합니다. 인용문 등이 어려워집니다. (?한다) :

#!/usr/bin/gawk -f 

BEGIN       { FS="," ; OFS=","  } 

$1 ~ /[\*\?]/ && $1 !~ /^\*$/ { gsub(/\*/, ".*" ,$1); 
           gsub(/\?/, "[0-9]",$1); 
           gsub(/\*/, ".*" ,$2); 
           print; } 

와 현재의 행동은 awk -f a.awk inputfile

로 사용 당신은 적절한 들여 쓰기, 주석, 수직 대칭을 가진 파일 (a.awk)에 쓸 수

:

echo 'AH??0*,*,ARRAY RESISTIVITY,RESISTIVITY 
AHD*,*,MEASURED DEPTH,REFERENCE 
AI*,*,ACOUSTIC IMPEDANCE COMPRESSIONAL,GEOPHYSICAL SYNTHETICS 
AI_AVG_HOR_SIG,*,ACOUSTIC IMPEDANCE,ACOUSTIC 
*,FOO,BAR,BLEH' | awk -f /tmp/a1 

AH[0-9][0-9]0.*,.*,ARRAY RESISTIVITY,RESISTIVITY 
AHD.*,.*,MEASURED DEPTH,REFERENCE 
AI.*,.*,ACOUSTIC IMPEDANCE COMPRESSIONAL,GEOPHYSICAL SYNTHETICS 
+0

감사합니다. 나는 Etan의 코멘트를 먹을 수 있었고 awk에 대한 정보를 좀더 얻을 수있었습니다. 자주 사용하지 않아도되었습니다. 그러나, 잠수 후에, 나는 그것이 나에게 시간의 톤을 미래에 저장할 것 인 곳을 볼 수있다. .. – juanschwartz