繁体   English   中英

awk 覆盖作为脚本参数给出的文件列值

[英]Awk overwritting file's column value given as script argument

./tool.sh -f <file> --edit <id> <column> <value>

必须执行,并且对于数据库,例如

#id|lastName|firstName|gender|birthday|creationDate|locationIP|browserUsed
933|Perera|Mahinda|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.123|Firefox
1129|Lepland|Carmen|female|1984-02-18|2010-02-28T04:39:58.781+0000|81.25.252.111|Internet Explorer
4194|Do|Hα»^Ó ChΓ­|male|1988-10-14|2010-03-17T22:46:17.657+0000|103.10.89.118|Internet Explorer
8333|Wang|Chen|female|1980-02-02|2010-03-15T10:21:43.365+0000|1.4.16.148|Internet Explorer
8698|Liu|Chen|female|1982-05-29|2010-02-21T08:44:41.479+0000|14.103.81.196|Firefox
8853|Monteno|Albin|male|1986-04-09|2010-03-19T21:52:36.860+0000|178.209.14.40|Internet Explorer
10027|Chen|Ning|female|1982-12-08|2010-02-22T17:59:59.221+0000|1.2.9.86|Firefox
1099511628908|Chen|Wei|female|1985-08-02|2010-05-24T20:52:26.582+0000|27.98.244.108|Firefox
1099511633435|Smith|Jack|male|1981-04-19|2010-05-26T03:45:11.772+0000|50.72.193.218|Internet Explorer
1099511635042|Kiss|Gyorgy|male|1984-09-14|2010-05-16T22:57:41.808+0000|91.137.244.86|Chrome
1099511635218|Law-Yone|Eric|male|1987-01-20|2010-05-26T20:10:22.515+0000|203.81.95.235|Chrome
1099511638444|Jasani|Chris|female|1981-05-22|2010-04-29T20:50:40.375+0000|196.223.11.62|Firefox

并给定 id 列和值,为该特定 id 更改该列中的值

前任。 ./tool.sh -f people.dat --edit 933 4 female

应该覆盖文件933|Mahinda|female|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.123|Firefox

我的代码是:

    while [ $# -gt 0 ]
    do
            case $1 in

            --edit)
                    id="$2";
                    col="$3";
                    val="$4";
            shift 3
            ;;
            -f)
                    dbfile=$2;
            shift
            esac
            shift
    done

    egrep -o '^[^#]+' ${dbfile} | awk -F '|' -v OFS='|'  -v id="${id}" -v col="${col}" -v val="${val}" '{if (($1="id") && ("col"<=8 && "col">=2)) {gsub($col,val)};{print}}'

到目前为止,文件中没有永久更改,唯一的更改是第一行的所有值都变为“id”

你得到了

if (($1="id") && ("col"<=8 && "col">=2)) {

       ^                   ^
       |                   | 
       |                   |
       |           Since you got string col, which will always evaluate false
       |
       |
   you are assigning field1 ($1) with string "id" which will be true always

如果你想对变量应用一些条件,那么你需要

if (($1==id) && ($col<=8 && $col>=2)) {

      ^                ^
      |                |
      |         AND column value corresponding to variable col is less
      |         than or equal to 8 and greater than or equal to 2 
      |                                     ^ 
      |                                     |
  if field1 is equal to variable id         |
      ^                                     |
      |                                     |
      |                                     |
      _____________ If both are true________|  
                      |
                      |

                   gsub($col, $val)

既然你有头衔

awk 覆盖作为脚本参数给出的文件列值

1)代替gsub($col, $val) ,您可以使用$col = $val

2) 不需要egrep -o '^[^#]+' ${dbfile} | 因为你的 awk 中有$1==id && $col<=8 && $col>=2 ,它会处理它,并且可以简化如下:

awk -F '|' -v OFS='|'  -v id="${id}" -v col="${col}" -v val="${val}" '
       $1==id && $col<=8 && $col>=2 { $col = val; print}
      ' "${dbfile}"

用这一行替换你的最后一行

sed -i '/'"$id"'/s/\([^|]*\)/'"$val"'/'"$col" "$dbfile"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM