0

我必须为特定的唯一 ID 更新文件中的特定列值。我的文件名和示例内容如下:

名称.txt

J017 0001 Amit 10th
J011 2341 Kuldeep 11th
J004 1254 Ramand  12th

我必须将第 4 列的值更新为 something 。我尝试了以下逻辑但没有用

stu="";
for i in `echo "J017, J058 and J107.  " |egrep -o '[jJ][0-9]{3}' `
do
   stu="$stu|$i ";
   awk -v I=$i '/$I/{$4="LEFT";print $0}'  Names.txt >tmp
done


egrep -v `echo "$stu" | sed "s/^|//g" ` Names.txt >>tmp

mv tmp Names.txt

上面的 awk 命令没有给出结果。请帮我修复错误。

4

4 回答 4

3

要回答您关于为什么会这样的具体问题:

awk -v I=$i '/$I/{$4="LEFT";print $0}'

不起作用,您不要通过在 awk 变量前面加上“$”来访问它们,就像您对 C 或大多数其他语言(shell 是一个例外)不这样做一样。这就是你如何编写上面的代码来执行你试图让它执行的方式:

awk -v I=$i '$0 ~ I{$4="LEFT";print $0}'

话虽如此,你的 shell 脚本是完全错误的方式来做你想做的事。试试这个(使用 GNU awk 进行 patsplit() 但 match()/substr() 在其他 awk 中也可以工作):

$ cat tst.sh
awk -v ids="J017, J058 and J107.  " '
BEGIN{
    patsplit(ids,idsA,/[jJ][0-9]{3}/)
    for (i=1;i in idsA;i++)
        stu = stu (i==1?"^":"|") idsA[i]
    stu = stu "$"
}
$1 ~ stu { $4 = "LEFT" }
{ print }
' "$@"

$ ./tst.sh file
J017 0001 Jagdeep LEFT
J011 2341 Kuldeep 11th
J004 1254 Ramand  12th
于 2013-09-24T16:26:55.307 回答
2
#!/bin/bash

FILE='Names.txt'    
COLUMNS=(J017 J011 J004)
REPLACE='LEFT'

OUT=$(
    IFS="|"
    awk -v R="$REPLACE" -v E="${COLUMNS[*]}" '$1 ~ E{$4 = R;print $0}' "$FILE"
)

echo "$OUT" > "$FILE"

运行:

bash script.sh

输入:

J017 0001 Jagdeep 10th
J011 2341 Kuldeep 11th
J004 1254 Ramand  12th

结果:

J017 0001 Jagdeep LEFT
J011 2341 Kuldeep LEFT
J004 1254 Ramand LEFT
于 2013-09-24T07:11:12.340 回答
0

名称.txt

J017 0001 Jagdeep 10th
J011 2341 Kuldeep 11th
J004 1254 Ramand  12th

awk

awk '/[jJ][0-9][0-9][0-9]/ {$4="LEFT"}1' Names.txt
J017 0001 Jagdeep LEFT
J011 2341 Kuldeep LEFT
J004 1254 Ramand LEFT
于 2013-09-24T08:47:37.473 回答
0

这可能对您有用:

echo "J017, J111 and J004.  " |
grep -o "J[0-9]\{3\}" |
awk 'FNR==NR{key[$1];next};$1 in key{$4="LEFT"}1' - Names.txt
于 2013-09-24T12:15:49.247 回答