2017-10-13 14 views
0

필드가 괄호로 묶고 세미콜론 (;)으로 구분됩니다와 특정 컬럼에 문자를 대체하는 방법 :AWK 내 파일 AWK 테스트에서

"col1";"col2";"col3";"col4";"col5"; 
"eiusmod";"tempor";"incididunt";"ut";"labore"; 
"et";"dolore";"magna";"aliqua";"Ut"; 
"enim";"ad";"minim";"veniam";"quis"; 
"ut";"aliquip";"ex";"ea";"commodo"; 
"nostrud";"exercitation";"ullamco";"laboris";"nisi"; 

실제 데이터 (헤더 행을 더한 세 가지 기록) :

"col1";"col2";"col3";"col4";"col5"; 
"/absence/lang/#LANG_ID#/.descr.php";"BP2_DESCR";"Dodaj";"Add";"Adicionar"; 
"/cal/lang/#LANG_ID#/cal_feed.php";"LF_COMM_MSG";"je komentiral ""#EVENT_TITLE#""";"commented on an event ""#EVENT_TITLE#""";"comentado sobre o evento ""#EVENT_TITLE#"""; 
"/mod/lang/#LANG_ID#/set_events.php";"IM_NOTIFY";"Pozdravljeni #USER_NAME#! 

#FROM_USER# vam je poslal(a) sporocilo. 

------------------------------------------ 

#FROM_USER#: #MESSAGE# 

------------------------------------------;"Hello #USER_NAME#! 

You have a new notification from #FROM_USER# 

------------------------------------------ 

#MESSAGE# 

------------------------------------------;"Olá #USER_NAME#! 

Você tem uma nova notificação de #FROM_USER# 

------------------------------------------ 

#MESSAGE# 

------------------------------------------; 

나는 3 열 문자 "M"을 경우 처음 30 열 개 3 라인과 4를 인쇄하는 방법을 알고 :

gawk 'BEGIN {FS = ";" } ; $3 ~/m/ {print $3 ";" $4} NR==30{exit}' OFS=';' awk-test 

결과 전 S :

"magna";"aliqua" 
"minim";"veniam" 
"ullamco";"laboris" 

하지만 난에 (ㄴ) "X"와 "M"을 대체 할 (a)는 어떻게 테스트 (30) 라인 샘플 에 "X"와 "M"을 대체 모른다 진짜 250.000 라인 파일. 테스트 AWK에

원하는 출력 : 현실에서

"xagna";"aliqua" 
"xinim";"veniam" 
"ullaxco";"laboris" 

나는 열 3 단의 문자에 오류를 수정해야합니다. 따라서 변경된 행을 쓰고 변경되지 않은 행을 고정 열 3을 포함하는 새 파일로 유지하는 방법을 알고 싶습니다.

미리 감사드립니다.

+0

수있는 필드를 세미콜론이나 개행 문자가 포함되어 있습니까? 대답이 "아니오"라면 왜 따옴표로 묶으십니까? –

+0

이 파일은 내 것이 아니며 처리해야하는 CSV 출력 파일입니다. 각 필드는 따옴표로 묶이고 세미콜론으로 구분됩니다. 세미콜론도 각 줄의 끝에 있습니다. 예, 필드에는 세미콜론과 개행 문자도 있습니다. – andrej

+0

그런 다음 두 가지 상황 중 하나가 없다고 가정 할 때 받아 들인 대답은 당신을 위해 작동하지 않습니다. 도움말을 원한다면 필드에 세미콜론과 개행 문자를 포함하여 진정으로 대표적인 샘플 입력과 출력을 보여주는 질문. –

답변

0

AWK 솔루션 : 한 - 라이너,

$ awk -f tst.awk file 
"xagna";"aliqua" 
"xinim";"veniam" 
"ullaxco";"laboris 

나 :

$ cat tst.awk 
BEGIN{FS=OFS=";"} 
NR>1 && sub(/m/,"x",$3){print $3, $4} 

이것은 당신의 실제 250.000 라인에서 작동이 파일

awk 'BEGIN{FS=OFS=";"} NR>1 && sub(/m/,"x",$3){print $3, $4}' file 
+0

$ 3에 m이 있는지 검사 할 필요가 없습니다. sub가 실패하면 그냥 실패합니다. – 123

+0

물론입니다. 나는 그 자신을 잘못 읽었습니다 : $ 3에'm '이없는 줄은 인쇄되어서는 안됩니다. 당신은'if' 조건문을 조건문으로 두는 것을 풀 수 있습니다. –

+1

당신은'awk 'BOOK {FS = OFS = ";"NR> 1 && sub (/ m /, "x", $ 3) {인쇄 $ 3, $ 4}'' – 123