如果关键字存在,则在主csv中搜索关键字,然后使用值true或false更新输入csv第2列

vktxenjb  于 2023-02-01  发布在  其他
关注(0)|答案(4)|浏览(112)

输入csv -新参数.csv
价值观如-

ID
Identity
as-uid
cp_cus_id
evs
k_n

master.csv具有类似于-的值

A, xyz, id, abc
n, xyz, as-uid, abc, B, xyz, ne, abc
q, xyz, id evs, abc
3, xyz, k_n, abc, C, xyz, ad, abc
1, xyz, zd, abc
z, xyz, ID, abc

要求输出更新new_param.csv -第2列中为真或假

ID,true
Identity,false
as-uid,true
cp_cus_id,false
evs,true
k_n,true

尝试以下代码无输出-

#!/bin/bash

declare -a keywords=(`cat new_param.csv`)
 
length=${#keywords[@]}

for (( j=0; j<length; j++ ));
do
 a= LC_ALL=C awk -v kw="${keywords[$j]}" -F, '{for (i=1;i<=NF;i++) if ($i ~ kw) {print i}}' master.csv
b=0
if [ $a -gt $b ]
then
  echo true $2 >> new_param.csv
else
  echo false $2 >> new_param.csv
fi
done

帮帮忙吧!
尝试上述代码,但没有帮助我
获取错误,如-
test.sh: line 29: [: -gt: unary operator expected test.sh: line 33: -f2: command not found

wnvonmuf

wnvonmuf1#

awk -v RS=', |\n' 'NR == FNR { a[$0] = 1; next }
        { gsub(/,.*/, ""); b = "" b $0 (a[$0] ? ",true" : ",false") "\n" }
        END { if (FILENAME == "new_param.csv") printf "%s", b > FILENAME }' master.csv new_param.csv
kmb7vmvb

kmb7vmvb2#

试试这个Shellcheck-clean pure Bash代码:

#! /bin/bash -p

outputs=()

while read -r kw; do
    if grep -q -E "(^|[[:space:],])$kw([[:space:],]|\$)" master.csv; then
        outputs+=( "$kw,true" )
    else
        outputs+=( "$kw,false" )
    fi
done <new_param.csv

printf '%s\n' "${outputs[@]}" >new_param.csv
  • 您可能需要根据要将哪些内容算作匹配项来调整与grep -E一起使用的正则表达式。
vshtjzan

vshtjzan3#

使用grep查找精确匹配的单词:

$ grep -owf new_param.csv master.csv | sort -u
ID
as-uid
evs
k_n

然后将其馈送到awk以匹配new_param.csv条目:

awk '
BEGIN   { OFS="," }
FNR==NR { a[$1]; next }
        { print $1, ($1 in a) ? "true" : "false" }
' <(grep -owf new_param.csv master.csv | sort -u) new_param.csv

这将产生:

ID,true
Identity,false
as-uid,true
cp_cus_id,false
evs,true
k_n,true

确认结果正确后,OP可将> new_param.csv添加到awk脚本末尾,例如:

awk 'BEGIN { OFS="," } FNR==NR ....' <(grep -owf ...) new_parame.csv > new_param.csv
                                                                     ^^^^^^^^^^^^^^^
jaql4c8m

jaql4c8m4#

替代awk选项:
使用,作为字段分隔符,并处理master.csv的每条记录的第3个字段。首先,从第3个字段中去掉前导/尾随空格,然后将其附加到变量m。其次,从new-params.csv文件中读取每条记录,并使用index函数确定m变量字符串中是否存在该记录。

awk -F"," '
FNR==NR{gsub(/^[ \t]+|[ \t]+$/, "", $3); m=m$3}
FNR<NR{print $0 (index(m,$0)>0 ? ",true" : ",false")}                           
' master.csv new-params.csv

输出:

ID,true
Identity,false
as-uid,true
cp_cus_id,false
evs,true
k_n,true

相关问题