2017-03-31 58 views
-1

我有这样的一个领域两个部分组成:AWK - 如何打印一个记录

Dagmar Schlecht(ID: 1233), Taubenstr- 246, 71108 Germany, [email protected] 1233 Shopping cart #3664 - Grüne Pillen; 

我怎么能打印的字符,直到第一个“)”出现在,例如,$ 1和字符〜 /“购物”和19个字符以上(所以部分“ - GrünePillen”正在被跳过)?

结果应写入新字段,例如$ 2:

Dagmar Schlecht(ID: 1233) Shopping cart #3664 
+0

阅读[问],您的问题越来越严重。 –

回答

1

如果您没有问题sed

sed -r 's/(^[^,]+).*(Shopping cart[^-]+)(.*)/\1 \2/' inputfile 
Dagmar Schlecht(ID: 1233) Shopping cart #3664 

这里,backrefrencing用于分隔记录成多个数据块,然后再使用\N简称。每组定义为()

相同的正则表达式可以与gawk一起使用,使用match函数支持thired参数。

awk '{match($0,/(^[^,]+).*(Shopping cart[^-]+)(.*)/,a);print a[1],a[2]}' 
Dagmar Schlecht(ID: 1233) Shopping cart #3664 
+0

恩,谢谢你的代码和参考。两者都远远落后于我的理解。在我的情况下,这是行不通的,因为我在我的输入中使用了德语Umlaute。至少这个错误信息似乎告诉了我。此外,这是一个便携式的愿望?我写了“如何才能打印字符,直到第一个”)出现在例如$ 1“中。我的awk脚本是这样的:regexfind {各种指令,打印}。我需要在这个regexfind {environement}中划分和重建记录 - 抱歉,我没有初步说清楚,因为我认为这没有必要。谢谢PS。 – prestalearner

+0

对不起!我错误地使用了“记录”一词,因为我认为我读过这些字段也被称为记录。但是记录可以这么说。无论如何,我需要在一个字段中“断开”一个字符串,例如1美元或永远。 – prestalearner

+0

@prestalearner记录包含一行或多行,行包含一个或多个字段。 –

0

有可能是在awk来做到这一点更漂亮的方式,但是这很好地做这项工作:

awk -F"[ ,]" '{cartFound=0; printf "%s %s %s", $1, $2, $3; for (i=4;i<=NF;++i){if($i=="Shopping"){cartFound=1} if(cartFound==1){ printf " %s", $i} if($i ~ /^#/){cartFound=0}}}{printf "\n"}' inputFile 

这里我们:

  1. 分割由空格记录或逗号:F"[ ,]"
  2. 由于我们正在创建新记录,因此我们将cartFound变量设置为0cartFound=0
  3. 我们打印使用printf前三个字段,因此不会扔在一个换行符:printf "%s %s %s", $1, $2, $3;
  4. 我们通过其余字段与一个for循环分配每个场序变量ifor (i=4;i<=NF;++i){
  5. 如果该字段的值Shopping然后我们确立了cartFound变量1if($i=="Shopping"){cartFound=1}
  6. 如果cartFound1然后我们再次使用printf将字段添加到我们的输出:if(cartFound==1){ printf " %s", $i}
  7. 如果我们打的一个哈希然后设置cartFound0启动现场:if($i ~ /^#/){cartFound=0}
  8. 最后我们printf了一个换行符结束输出记录:{printf "\n"}
0

的sed方法:

sed -En 's/^([^,]+),.+(Shopping.{11}).*/\1 \2/p' testfile 

Dagmar Schlecht(ID: 1233) Shopping cart #3664 
0
awk '{print $1,$2,substr($3,1,5),$10,$11,$12}' file 

Dagmar Schlecht(ID: 1233) Shopping cart #3664