我正在尝试将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和END块,但我试图避免BEGIN和END块的原因是为了避免嵌套的awk。
我计划在#Some复杂代码......中添加另一个循环和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}'`
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
答案 0 :(得分:4)
您可以使用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
与William提供的答案一起使用:
IFS=',';
while read var1 var2 var3; do
...
done < file.txt
它们在功能上是相同的,它只取决于您是否要明确设置var1=$1
或在while
- 循环的头部定义它。
答案 1 :(得分:3)
你为什么要使用awk
?
while IFS=, read var1 var2 var3; do
...
done < file.txt
答案 2 :(得分:0)
#!/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个值更具动态性