2016-03-23 82 views
0

我有一个文件.DAT这种格式awk中壳脚本

#id|firstName|lastName|gender|birthday|creationDate|locationIP|browserUsed 
933|Mahinda|Perera|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.123|Firefox 
1129|Carmen|Lepland|female|1984-02-18|2010-02-28T04:39:58.781+0000|81.25.252.111|Internet Explorer 

,我想替换的柱(柱的数量从用户给出与命令./tool.sh -f <file> --edit <id> <column> <value>)与值(值从给定使用相同的命令的用户),我不能插入内AWK <column>参数

#!/bin/bash 
if [ "$1"="-f" ] ; then 
    if [ "$3"="--edit" ] ; then 

y=$6 
x="$"$5 
awk -F '|' ' '$4'==$1{$x-=$y;print }' <$2 

fi 
fi 

我想是这样的,当用户给这个命令

./file.sh -f file --edit 933 3 spyros 

(比以前的值为 “佩雷拉” 更改为“斯皮罗斯·第三场)

933|Mahinda|spyros|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.123|Firefox 
+1

你的awk脚本应该做什么很不清楚。您似乎将shell语法与awk语法和awk字段与shell位置参数和/或变量混合在一起。和idk为什么你有一个' - ='在那里根据你的描述。编辑您的问题以提供更好的解释,您想要执行的操作的示例,以及给出您发布的示例输入的预期输出。 –

+0

您应该向我们展示脚本的示例调用。例如,你讨论'./tool.sh -f --edit',但是''edit'变成了'$ 2',但是你在'$ 3'中测试它。它看起来好像你从$ 2重定向,所以大概你的意思是'./tool.sh -f filename --edit ...',但是它并不完全清楚你在第4,5和6章中的期望。你应该可能使用'-v'将值传递给shell中的'awk'。 –

+0

我编辑我的问题与预期的输出 –

回答

2

它看起来像你想的:

awk -v key="$4" -v fldNr="$5" -v val="$6" 'BEGIN{FS=OFS="|"} $1==key{$fldNr=val;print}' "$2" 
0

正如@ ED-莫顿,但我已经使用了命名字段:

awk -v id=933 -v field=lastName -v value=spyros \ 
'BEGIN{OFS=FS="|"} NR==1 {for (i=1; i<=NF; i++) a[$i]=i; print} NR>1 {if($a["#id"]==id) $a[field]=value; print}' \ 
file