替换拆分文件bash shell

时间:2016-03-29 18:55:31

标签: bash file shell awk edit

我正在尝试使用以下格式访问文件的字段

F1|F2|F3|F4|F5|F6|F7|F8

用户会给我命令:

  

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

tool.sh 是代码文件的名称, id 是第一个字段是需要替换值的列是我必须替换的字符串(F1),我将不得不扫描找到id匹配的文件,当我找到正确的行需要转到右列时(将由用户)并用替换F(列)。 这是我的一个想法:

awk -v id="$4" -v column = "$5" -v value = "$6" -F"|" 
'BEGIN{OFS="|"} ($1 == id){$(column)=value;}'  $2

我将在awk中设置值并在其中使用它但我得到

awk: cmd. line:1: fatal: cannot open file `=' for reading (No such file or directory)

我是bash shell的新手,你可能会看到重大错误

2 个答案:

答案 0 :(得分:0)

bash空间中的

很重要。变量声明中的=符号周围不应有空格。将其更改为:

awk -F'|' -v id="$4" -v column="$5" -v value="$6" 'BEGIN{OFS=FS} $1==id{$column=value}' $2

答案 1 :(得分:0)

文件内容:

F1|F2|F3|F4|F5|F6|F7|F8
G1|G2|G3|G4|G5|G6|G7|G8
H1|H2|H3|H4|H5|H6|H7|H8

script shell tool.sh:

#!/bin/sh
params=$*
file_to_use=`echo $params | sed -e "s/ -/\n-/g" |  sed -n "s/^-f  *\(.*\)/\1/p"`
field_to_edit=`echo $params |  sed -e "s/ -/\n-/g" | sed -n "s/^--edit  *\(.*\)/\1/p"`

if [ "$file_to_use" != "" ] && [ -f $file_to_use ] && [ "`echo $field_to_edit | grep -E "^[0-9]+$"`" != "" ]; then
 cat $file_to_use | cut -d"|" -f$field_to_edit
else
 echo " Error of parameters"
fi

测试:

 ./tool.sh -f non_exist_file --edit 5
 Error of parameters

 ./tool.sh -f file --edit x
 Error of parameters

 ./tool.sh -f file --edit 6
F6
G6
H6