在职的

在职的

如何在 .csv 文件中的两个不同列中搜索两个字符串,并仅当两个字符串位于同一行时才打印输出。

两个字符串值都存储在两个变量中。

在 .csv 文件的第二列中搜索第一个字符串,在第四列中搜索第二个字符串,并且仅当在同一行中找到两个字符串匹配时才打印输出。

我尝试使用下面的命令来搜索一行中的一个匹配字符串,但是如何匹配两个不同列中的两个字符串?

awk -v pat="$list" -F":" '$0 ~ pat { print $1, $2, $3, $4 }' filename.csv

答案1

使用awk

awk -v pat1="$var1" -v pat2="$var2" -F, '($2==pat1&&$4==pat2)' infile.txt 

答案2

使用GNU sedyou 可以完成给定的任务:

# bash function to properly escape the variable contents
# s.t. it can be used on the LHS of a sed s/// command
escVar() {
   printf '%s\n' "$1" | sed -e 's:[][^\./$*]:\\&:g'
}

# now define your patterns to be used
pat1=$(escVar "$DC")
pat2=$(escVar "$CountryCpde")

# main...
sed -Ee '
   h;s/[^,]+/\n&\n/2; s/[^,]+/\n&\n/4'"
   /\n.*$pat1.*\n.*\n.*$pat2.*\n/"'!d;g
' filename.csv

另外,您可以使用Perl以下命令来完成此任务:

perl -F, -slane '
   BEGIN{ @h{qw/1 3/} = (*pat1, *pat2); }
   print if 2 == grep { 1 + index $F[$_], ${$h{$_}} } qw/1 3/;
' -- -pat1="$DC" -pat2="$CountryCode" -- filename.csv

在职的

  • 将字段分隔符设置为逗号,并开启文件自动读入(-n),-s即可在命令行中声明变量。
  • 设置一个散列,其值为 typeglobs *pat1、*pat2。
  • 然后在第二个字段 $F[1] 中查找 pat1,在第四个字段 $F[3] 中查找 pat2,只有当在同一条记录上找到两者时,才打印该记录。

相关内容