如何组合这些awk命令?

时间:2018-01-17 17:56:05

标签: awk

有人可以向我解释如何将这些管道问题合并到一个awk中吗?

awk 'match($0, /(,|^)[^,]*shalvar[^,]*(,|$)/) {
  print substr($0, RSTART, RLENGTH)}' file.txt |
awk 'gsub(",","")' | awk '{$1=$1};1'

我试试这个,但它不起作用:

awk 'match($0, /(,|^)[^,]*shalvar[^,]*(,|$)/) {
  gsub(",","");$1=$1;print substr($0, RSTART, RLENGTH)}' file.txt

我知道它不应该工作,因为字符被删除但指针不会改变。我现在该怎么办?

1 个答案:

答案 0 :(得分:2)

你需要反过来包装东西。收集要提取的字符串,然后对提取的值进行操作,就像管道中包含多个Awk脚本的原始脚本一样。

awk 'match($0, /(,|^)[^,]*shalvar[^,]*(,|$)/) {
  g=substr($0, RSTART, RLENGTH);
  gsub(",","",g);
  # $1=$1 is nice but we cannot use that here; here is a workaround
  gsub(/^ *| *$/, "", g);
  print g}' file.txt

如果您确信只有一个字段,则用于修剪值周围空格的快捷方式$1=$1在隔离的Awk脚本中工作,但在这里,我们不一定只有一个字段(或者我们?)所以我使用一个更通用的解决方案来明确地修剪提取的字符串周围的空白,这也避免了依赖于一个众所周知但仍然模糊不清的副作用。

如果shalvar实际上是您想从shell $foo收到的变量,请尝试

awk -v field="$foo" 'match($0, "(^|,)[^,]*" field "[^,]*(,|$)") {
    ...

将变量插入到一个字符串中,然后将其作为正则表达式应用。