我在bash代码中使用awk语句遇到了一些困难

时间:2014-07-09 16:40:41

标签: linux bash shell awk scripting

我正在尝试检查某些值(DIC,IC,RNDIC)是否在文本文件的第一行中,但不在第一列中。缝下所有细节。并不是说文本文件中的每个字段都是表格式的。

file.txt的

NO   DIC   IC   RNDIC   FI   BO   CF
---
1    2    3    4    5    6

这是我必须处理此文件的代码:

type=$(awk 'NR==1 {
   for (i = 1; i <= NF; i++) 
   {
      if (i != 1 && ($i == "DIC" || $i == "IC" || $i == "RNDIC")) 
         print "1"   
   }  
}' $PWD/file.txt)

if [[ $type == "1" ]]; then
   # rest of the code is irrelevant
fi

echo $type

问题是它在if初始化后永远不会进入$type语句。原因是$type实际上是1 1而不是1。我意识到我犯的错误是if循环中的for声明,但我不知道如何修复它。有什么建议?感谢。

如果需要进一步说明,请告诉我。

2 个答案:

答案 0 :(得分:1)

您可以在打印exit一次后致电1

type=$(awk 'NR==1 {
   for (i = 1; i <= NF; i++) {
      if (i != 1 && ($i == "DIC" || $i == "IC" || $i == "RNDIC")) {
         print "1"
         exit
      }
   }  
}' $PWD/file.txt)

答案 1 :(得分:1)

如果您使用bash,则无需分叉并依赖awk:

read -ra FIELDS < "$PWD/file.txt"
for A in "${FIELDS[@]:1}"; do
    case "$A" in
    DIC|IC|RNDIC)
        # <do some things>
        break
        ;;
    esac
done

或者

function is_type1 {
    local FIELDS A
    read -ra FIELDS < "$1"
    for A in "${FIELDS[@]:1}"; do
        case "$A" in
        DIC|IC|RNDIC)
            return 0
            ;;
        esac
    done
    return 1
}

if is_type1 "$PWD/file.txt"; then
    # <do some things>
fi

注意:我刚使用case,因为我不知道bash的版本,extglob可能很麻烦。