我正在尝试一次将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 个值更具动态性