2016-03-23 110 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