awk - solaris中的反引号接受命令行arg

时间:2012-01-04 12:37:13

标签: linux bash shell unix awk

我有这个脚本,用于修剪指定为脚本参数的字段。 即sh script.sh file.txt "|" 2

#!/bin/bash
filename="$1"
delim="$2"
arg="$3"
gsubber="\"gsub("^[ \t]*|[ \t]*$","",'\$$arg')\""
myout=`nawk -F"$delim" -v fl="$gsubber" \'{ { fl } }1\' OFS="$delim" "$filename"`
echo "$myout"

所以这个文件'file.txt'作为输入:

sid|storeNo|latitude
9| gerdy| fd¿kjhn422-405
0000543210 |gfdjk39
gfd|fd||fd

成为此输出:

sid|storeNo|latitude
9|gerdy| fd¿kjhn422-405
0000543210 |gfdjk39
gfd|fd||fd

我收到此错误: nawk:源代码行1处的语法错误  上下文是

  
    
      

'<<<               失踪 }       nawk:在源头线1救助

    
  

一旦有人可以协助提供正确的语法,我就可以毫不费力地扩展它以支持多个字段。即sh script.sh file.txt "|" 2 3然后可以仅修剪第2和第3个字段。

提前致谢!

2 个答案:

答案 0 :(得分:1)

尝试:

#!/bin/bash

filename=$1
delim=$2
arg=$3
regex='^[ \t]*|[ \t]*$'
myout=$(
  nawk -F"$delim" -v regex="$regex" -v arg="$arg" '
    { gsub(regex, "", $arg) }
    1' OFS="$delim" "$filename"
  )

printf '%s\n' "$myout"

编辑:

为了处理参数中的多个字段(请参阅下面的评论):

#!/bin/bash

filename=$1 
delim=$2
shift 2
args=$@
regex='^[ \t]*|[ \t]*$'
myout=$(
  nawk -F"$delim" -v regex="$regex" -v args="$args" '{ 
    n = split(args, t, " ")
    for (i = 0; ++i <=n;)
      gsub(regex, "", $t[i]) 
    }1' OFS="$delim" "$filename"
  )

printf '%s\n' "$myout"

答案 1 :(得分:0)

这应该有效:

#!/bin/bash
filename="$1"
delim="$2"
arg="$3"
myout=`nawk -F"$delim" -v f="$arg"  '{gsub(/^[ \t]*|[ \t]*$/,"",$f) }1' OFS="$delim" "$filename"`
echo "$myout"

您不必提取gsub,因为在gsub函数调用中,只有字段索引是可变的。你可以将字段索引作为var传递给awk。