我正在尝试创建一个执行以下示例所做的bash脚本:
编辑前:
#id/name/surname/age
4|Rebecca|Jones|24
5|Nick|Simmons|31
现在当我运行脚本时,我想用ID确定哪一行会改变,另一个参数在这一行中是哪一列。 编辑后:
./script.sh 4 2 Rachel #we are changing the second column in row with ID=4
#id/name/surname/age
4|Rachel|Jones|24
5|Nick|Simmons|31
后来我想通过覆盖现有的.txt来保存
提前感谢您的帮助!
通过使用Bohah提供的解决方案,终端上的结果如下:
Usage: gawk [POSIX or GNU style options] -f progfile [--] file ...
Usage: gawk [POSIX or GNU style options] [--] 'program' file ...
POSIX options: GNU long options: (standard)
-f progfile --file=progfile
-F fs --field-separator=fs
-v var=val --assign=var=val
Short options: GNU long options: (extensions)
-b --characters-as-bytes
-c --traditional
-C --copyright
-d[file] --dump-variables[=file]
-e 'program-text' --source='program-text'
-E file --exec=file
-g --gen-pot
-h --help
-L [fatal] --lint[=fatal]
-n --non-decimal-data
-N --use-lc-numeric
-O --optimize
-p[file] --profile[=file]
-P --posix
-r --re-interval
-S --sandbox
-t --lint-old
-V --version
To report bugs, see node `Bugs' in `gawk.info', which is
section `Reporting Problems and Bugs' in the printed version.
gawk is a pattern scanning and processing language.
By default it reads standard input and writes standard output.
Examples:
gawk '{ sum += $1 }; END { print sum }' file
gawk -F: '{ print $1 }' /etc/passwd
答案 0 :(得分:1)
我将使用GNU Awk(如果需要,将其包装到shell脚本中):
gawk\
-v key=4\
-v col=2\
-v val='Rachel'\
-i inplace\
'BEGIN { FS = "|"; OFS="|" } $1 == key { $(col) = val } { print }'\
~/tmp/filename.txt
答案 1 :(得分:1)
使用sed:
sed -i "/^$1|/s/|\([^|]*\)/|$3/$(( $2-1 ))" file.txt
/^$1|/
:搜索与传递给脚本的第一个参数值匹配的行s
:替换命令|\([^|]*\)
:搜索包含|
后跟任何非竖线字符的字符串。使用括号,捕获最后一个字符串以进行反向引用|$3
将先前的模式替换为|
,后跟第三个参数值$(( $2-1 ))
:算术扩展以减少第二个参数的值。放置在替换命令末尾的此修饰符指定将替换模式|\([^|]*\)
的哪个匹配项