文件由脚本使用输入文件修改 -
141,141_1,酒吧,本田,ps2_0,未分配,ps3_0,未分配,ps4_0,未分配,ps5_0,未分配,ps6_0,未分配,ps7_3,直到威尔,.....
输入文件-
141、PS7,蒂尔威尔
现在我需要搜索 ps7_3 列是否已更新为正确的值。
因此,我从输入文件中分离了列 -
while read -r line;
do
sub1=$(echo $line|cut -f 1 -d ',');
sub2=$(echo $line|cut -f 2 -d ',');
sub3=$(echo $line|cut -f 3 -d ',');
sub4=$(echo $sub2'.*,'$sub3|sed -e "s/\(.*\)\r/'\1'/");
echo $sub1;
echo $sub2;
echo $sub3;
echo $sub4;
grep $sub4 modded_file.csv.dat;
done<input.csv
输出是-
141
ps7
TILL WILL
'ps7.*,TILL WILL'
grep: WILL': No such file or directory
但当我跑步时 grep 'ps7.*,TILL WILL' modded_file.csv.dat
,它起作用了。如何在文件中 grep 一个如上所示的变量?
答案1
正如您从输入中看到的那样,变量 sub4 中有空格符号,因此重写此行:
grep $sub4 modded_file.csv.dat;
成为
grep -- "$sub4" modded_file.csv.dat;
(@philippos 补充)
并且$sub4
不应包含单引号'
,因为它们将被视为搜索模式的一部分。
我认为您的误解是如何执行引用和扩展的顺序:您认为首先将扩展变量,然后执行引用,因此扩展后变量的单引号将引用字符串。但实际上引用是在变量扩展之前完成的,所以你需要引用$sub
答案2
grep
在循环内运行是一个巨大的反模式。试试这个吧。
awk -F "," 'NR==FNR { key[$1]=$2; value[$1]=$3; next }
($1 in key) && ($0 !~ "^" $1 ",.*," key[$1] "," value[$1] ",")' input.csv modded_file.csv.dat
我没有试图理解为什么你想要或期望\r
在那里以某种方式所以这可能需要一些调整。
Awk 脚本由一系列 *条件{
操作对组成}
,这些操作对依次应用于每个输入行。您可以使用next
跳过此输入行的剩余脚本并跳到下一个输入,并且可以省略{
行动}
如果您只想打印整个输入行。 (您也可以省略状况 如果您想无条件地执行某些操作。)每一行都分为字段,这些字段在脚本中可用作 、 等 $1
。将字段分隔符设置为逗号(默认为空格序列)。$2
-F ","
该NR==FNR
习惯用法是在 Awk 中处理两个输入文件的常见方法。当您处理第一个输入文件时,总行号NR
将等于文件内的行号,随后为 false。FNR
当我们读取第一个文件时,我们将字段存储在两个关联数组中,两个数组都以第一个字段为键。
当我们读取第二个文件时,我们打印在数组中找到键的每个输入行key
,并且整行与预期的正则表达式不匹配(第一个字段是键,后跟任何内容,后跟逗号,列我们存储在 中的名称key[$1]
,另一个逗号,我们存储在 中的预期值value[$1]
,还有另一个逗号)。
换句话说,这会找到不满足预期条件的行。!
如果您想要火柴,请取出。