如何在 CSV 文件中搜索某个值,然后获取与其关联的另一个值?

如何在 CSV 文件中搜索某个值,然后获取与其关联的另一个值?

我的文件.csv

445,aLabel
446,anotherLabel
447,aThirdLabel

在 bash 脚本中,我想在 myfile.csv 中搜索“anotherLabel”是否存在(以不区分大小写的方式)并获取值 446。此外,如果“anotherLabel”不存在,我想添加它到最后,将前一行的标记加 1。

我从以下声明开始if

if grep -Fiq anotherLabel myfile.csv; then
    #get the value of field 1 (446 in this example) and store it in a variable
else
    #increment the last value of field 1 present in the file and store it in a variable
    #and append "448,anotherLabel" to myfile.csv
fi

我不确定使用 grep 验证标签是否在文件中是否是解决此问题的最佳方法,或者是否有使用 sed 或 awk 的更简单的方法。

答案1

试试这个:

 awk -F',' '{ if ($2 == "anotherLabel") { print $1 } }' myfile.csv

答案2

使用greptail

search="anotherLabel"
file=myfile.csv

if value=$(grep -Pio -m1 "^[0-9]+(?=,$search$)" "$file"); then
    echo "do something with $value"
elif lastvalue=$(tail -n1 "$file" | grep -o '^[0-9]\+'); then
    # append lastvalue + 1 and search string
    echo "$((++lastvalue)),$search" >> "$file"
else
    # handle error
    echo "error. no integer value in last line of \"$file\" found." >&2
fi

第一个grep使用以下选项:

  • -P启用 Perl 兼容的正则表达式 (PCRE) 以使用正向前瞻(见下文)。
  • -i忽略模式中的大小写
  • -o只打印该行的匹配部分
  • -m1第一场比赛后停止

第一个正则表达式^[0-9]+(?=,$search$)使用正向先行(?=pattern)来匹配后跟的数字,和不带逗号的搜索字符串,并且搜索字符串是匹配本身的一部分。与选项组合时,-o仅打印匹配的部分(数字)。

答案3

如果你想在纯 bash 中执行此操作:

file="myfile.csv"
seek="anotherLabel"
while IFS=, read id label; do
    if [[ $label == "$seek" ]]; then
        myid=$id
        break
    fi
    lastid=$id
done < "$file"
if [[ -z $myid ]]; then
    myid=$((lastid + 1))
    echo "$myid,$seek" >> "$file"
fi
echo "$seek id is: $myid"

答案4

以下 awk 代码可以满足您的要求:

#!/bin/bash

filetosearch=myfile.csv
searchString=${1:-anotherLabel}

awk -F',' -v pat="$searchString" '
BEGIN{patl=tolower(pat);flag=0};
{prev=$1}(tolower($0)==patl){flag=1;exit}
END{
     if(flag){
          print prev
             }else{
          printf("%s%s%s\n", prev+1,FS,pat) >> ARGV[1]    # use ARGIND in gawk.
          print prev+1
             }
   }' "${filetosearch}"

"${searchString}"搜索与整行完全匹配的字符串(更改tolower($0)==patltolower($0)~patl更宽松地匹配)并报告在哪个索引处找到它。如果字符串不匹配,则将其添加(附加)到所使用的文件中,其索引比文件的最后一个索引大 1。

例子:

$ ./script aLabel
445

$ ./script anotherLabel
446

$ ./script MissingLabel
450

$ cat myfile.csv
445,aLabel
446,anotherLabel
447,aThirdLabel
448,dhdhdhdhdhd
449,anotherLabel4646
450,MissingLabel

相关内容