【问题标题】:replace something in a particular field of a splited file bash shell替换拆分文件bash shell的特定字段中的某些内容
【发布时间】:2016-07-17 12:15:59
【问题描述】:

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

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

用户会给我命令:

./tool.sh -f file --edit id列值

tool.sh是代码文件的名称,id是第一个字段column是需要替换值的列value 是我必须替换的字符串(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 的新手,你可能会看到很大的错误

【问题讨论】:

  • ./tool.sh -f people.txt --edit 933 2 字符串被替换

标签: bash file shell awk edit


【解决方案1】:

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

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

【讨论】:

  • 你说得对,我纠正了它,但我没有得到预期的结果,文件保持不变
  • 输入文件不会改变,检查生成的输出。
【解决方案2】:

文件内容:

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

脚本外壳工具.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

【讨论】:

    猜你喜欢
    • 2023-01-03
    • 2011-05-21
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多