2017-10-13 92 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的前30行和4列,如果3具有字符“M”:

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

结果我S:

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

但我不知道 的(a)如何与 “X” 替换 “m” 个在测试30行样品 (b)如何更换 “m” 个以 “X” 上一个真正的250.000行文件。

上测试AWK所需的输出:

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

在现实中,我需要修复的只有3列上的字符错误。因此,我想知道如何编写已更改的行并将未更改的行保存到包含固定列3的新文件中?

预先感谢您!

+0

可你的领域包含分号码或换行符?如果答案是“否”,那么你为什么用引号括起来? –

+0

这个文件不是我的,它是一个我必须处理的CSV输出文件。每个字段都用引号括起来,并用分号分隔。分号也在每行的结尾。是的,域也包含分号和换行符。 – andrej

+0

然后,您接受的答案将不适用于您,因为它假定您没有这些情况。如果你需要帮助,你的问题将显示一些真正具有代表性的样本输入和输出,包括字段中的分号和换行符。 –

回答

0

awk的解决方案:

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

这会在你的真正 250.000线工作文件:

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

,或者用一个班轮:

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

不需要检查$ 3是否包含m,如果不存在,sub就会失败 – 123

+0

当然。我自己误解了这个问题:无法打印$ 3中没有“m”的行。你可以解决这个问题,把sub作为条件放在'if'中。 –

+1

你可以做'awk'BEGIN {FS = OFS =“;”} NR> 1 && sub(/ m /,“x”,$ 3){print $ 3,$ 4}'' – 123