一次将多个字段设置为 awk 变量



我正在尝试一次将awk变量字段设置为多个字段。

现在我只能一一设置变量。

for line in `cat file.txt`;do
    var1=`echo $line | awk -F, '{print $1}'`
    var2=`echo $line | awk -F, '{print $2}'`
    var3=`echo $line | awk -F, '{print $3}'`
    #Some complex code....
done

我认为这是昂贵的,因为它多次解析 linux 变量。是否有特殊的语法可以一次设置变量?我知道awk有一个BEGIN and END块,但我试图避免BEGIN 和END块的原因是为了避免嵌套的awk。

我计划在 #Some 复杂的代码中放置另一个循环和awk代码。.part。

for line in `cat file.txt`;do
    var1=`echo $line | awk -F, '{print $1}'`
    var2=`echo $line | awk -F, '{print $2}'`
    var3=`echo $line | awk -F, '{print $3}'`
    for line2 in `cat file_old.txt`;do
        vara=`echo $line2 | awk -F, '{print $1}'`
        varb=`echo $line2 | awk -F, '{print $2}'`
        # Do comparison of $var1,var2 and $vara,$varb , then do something with either
    done
done
您可以使用

IFS内部字段分隔符来使用逗号(而不是空格)并在while循环中执行分配:

SAVEIFS=$IFS;
IFS=',';
while read line; do
    set -- $line;
    var1=$1;
    var2=$2;
    var3=$3;
    ...
done < file.txt
IFS=$SAVEIFS;

这将保存当前IFS的副本,将其更改为,字符,然后遍历文件中的每一行。行set -- $line;将每个单词(用逗号分隔)转换为数字变量($1$2等)。您可以直接使用这些变量,也可以将它们分配给其他(更有意义的)变量名称。

或者,您可以将IFS与威廉提供的答案一起使用:

IFS=',';
while read var1 var2 var3; do
    ...
done < file.txt

它们在功能上是相同的,它只是归结为您是否要显式设置var1=$1或在while循环的头部定义它。

你为什么要使用awk

while IFS=, read var1 var2 var3; do
  ...
done < file.txt
#!/bin/bash    
FILE="/tmp/values.txt"
    function parse_csv() { 
    local lines=$lines;
    > $FILE
    OLDIFS=$IFS;
    IFS=","
    i=0
    for val in ${lines}
    do
      i=$((++i))
      eval var${i}="${val}"
    done
    IFS=$OLDIFS;
    for ((j=1;j<=i;++j))
    do
      name="var${j}"
      echo ${!name} >> $FILE
    done
    }
    for lines in `cat file_old.txt`;do
     parse_csv;
    done

您描述的问题只有 3 个值,是否有可能 3 个值可能不同并且是 4 或 5 或未定义?

如果是这样,上述内容将逐行解析 csv,并在名为/tmp/values 的文件中的新行上一次输出每个值.txt

随意修改以满足您的要求,它比定义 3 个值更具动态性

相关内容

  • 没有找到相关文章

最新更新