awk - 如何打印一条记录的两个部分

时间:2017-03-31 13:15:09

标签: awk

我得到了这样的字段:

Dagmar Schlecht(ID: 1233), Taubenstr- 246, 71108 Germany, dr_schlecht@t-online-de 1233 Shopping cart #3664 - Grüne Pillen;

如何在第一个“)”出现之前打印字符,例如$ 1和〜/“Shopping”中的字符和19个字符(因此跳过部分“ - GrünePillen”)?

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

Dagmar Schlecht(ID: 1233) Shopping cart #3664

4 个答案:

答案 0 :(得分:1)

如果您对sed感到满意:

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

这里,backrefrencing用于将记录分成多个块,然后使用\N引用。每个组由()

定义

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

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

答案 1 :(得分: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. 如果我们点击以哈希开头的字段,则将cartFound设置回0if($i ~ /^#/){cartFound=0}
  8. 最后我们printf输出换行符以结束输出的记录:{printf "\n"}

答案 2 :(得分:0)

sed 方法:

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

Dagmar Schlecht(ID: 1233) Shopping cart #3664

答案 3 :(得分:0)

awk '{print $1,$2,substr($3,1,5),$10,$11,$12}' file

Dagmar Schlecht(ID: 1233) Shopping cart #3664