Grep 文件中的变量

Grep 文件中的变量

文件由脚本使用输入文件修改 -

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],还有另一个逗号)。

换句话说,这会找到不满足预期条件的行。!如果您想要火柴,请取出。

相关内容