Bash Script Awk条件

时间:2015-04-01 10:39:01

标签: linux bash shell awk

我有这个代码的问题..我无法弄清楚我必须写什么条件用awk剪切我的文件。

i=0    
while [ $i -lt 10 ]; #da 1 a 9, Ap1..Ap9
    do

      case $i in
        1) RX="54:75:D0:3F:1E:F0";;
        2) RX="54:75:D0:3F:4D:00";;
        3) RX="54:75:D0:3F:51:50";;
        4) RX="54:75:D0:3F:53:60";;
        5) RX="54:75:D0:3F:56:10";;
        6) RX="54:75:D0:3F:56:E0";;
        7) RX="54:75:D0:3F:5A:B0";;
        8) RX="54:75:D0:3F:5F:90";;
        9) RX="D0:D0:FD:68:BC:70";;
        *) echo "Numero invalido!";;
      esac
      echo "RX = $RX" #check 
      awk -F, '$2 =="$RX" { print $0 }' File1 > File2[$i] #this is the line!
  i=$(( $i + 1 ))
  done

命令echo正确打印但是当我在AWK中使用相同的“$ RX”条件时它不起作用(它打印一个空白页)。 我的文件1:

1417164082794,54:75:D0:3F:53:60,54:75:D0:3F:1E:F0,-75,2400,6 1417164082794,54:75:D0:3F:56:10,54:75:D0:3F:1E:F0,-93,2400,4 1417164082794,54:75:D0:3F:56:E0,54:75:D0:3F:1E:F0,-89,2400,4 1417164082794,54:75:D0:3F:5A:B0,54:75:D0:3F:1E:F0,-80,2400,4 1417164082794,54:75:D0:3F:53:60,54:75:D0:3F:1E:F0,-89,5000,2

你可以告诉我正确的表达方式“awk -F ......”

非常感谢你!

2 个答案:

答案 0 :(得分:3)

要将变量从shell传递到awk,请使用-v:

awk -F, -v R="$RX" '$2 ==R { print $0 }' File1 > File2[$i]

答案 1 :(得分:0)

@Ricky - 任何时候你在shell中编写循环只是为了操作文本你有错误的方法。它不是创建shell的原因 - 它是创建awk的原因,而是创建shell来调用像awk这样的命令。

只需使用一个awk命令而不是读取File 10次并为文件的每一行打开变量,只需执行一次,如下所示:

BEGIN {
    split(file2s,f2s)
    split("54:75:D0:3F:1E:F0\
           54:75:D0:3F:4D:00\
           54:75:D0:3F:51:50\
           54:75:D0:3F:53:60\
           54:75:D0:3F:56:10\
           54:75:D0:3F:56:E0\
           54:75:D0:3F:5A:B0\
           54:75:D0:3F:5F:90\
           D0:D0:FD:68:BC:70", rxs)
    for (i in rxs) {
        rx2file2s[rxs[i]] = f2s[i]
    }
}
{
    if ($2 in rx2file2s) {
        print > rx2file2s[$2]
    }
    else {
        print NR, $2, "Numero invalido!" | "cat>&2"
    }
}

然后您将awk -v file2s="${File2[@]}" -f script.awk File1

调用

我说&#34;类似&#34;因为你没有提供任何样本输入(File1内容)或预期输出(File2 *值和内容)所以我无法测试它,但如果不完全正确,它将非常接近你所需要的。< / p>