Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 两个csv文件之间的bash字符串比较_String_Bash_Csv_Compare - Fatal编程技术网

String 两个csv文件之间的bash字符串比较

String 两个csv文件之间的bash字符串比较,string,bash,csv,compare,String,Bash,Csv,Compare,我有两个字符串(从csv解析),每个字符串大约有200列。我需要比较它们并确定哪一列是不同的。例如: str1file1="a,b,c,d,e,f,pp,qq" str2file2="a,b,c,d,x,f,pp,qq" 我需要得到列号5和相应的值作为我的输出。示例:5 e f 因为我需要比较数百万个这样的字符串,所以速度是关键。实际记录- 0x0009aeef,xyz,wert,57116,192.168.17.1,45320,192.168.17.2,45320,ctty,lkipop,1

我有两个字符串(从csv解析),每个字符串大约有200列。我需要比较它们并确定哪一列是不同的。例如:

str1file1="a,b,c,d,e,f,pp,qq"
str2file2="a,b,c,d,x,f,pp,qq"
我需要得到列号5和相应的值作为我的输出。示例:5 e f 因为我需要比较数百万个这样的字符串,所以速度是关键。实际记录-

0x0009aeef,xyz,wert,57116,192.168.17.1,45320,192.168.17.2,45320,ctty,lkipop,1408477403,1408477403,,1408477722,1408477403,1408477718,2,0,5,98,0,3055925732,0,0,0,0,15756,15732,24,0,0,0,0,0,0,0.68,23,0,1,23,15776,0.00,15270,459,1,0,0,0,0,0,0,0,0,0,5.755,1408477403,1408477718,2,0,7,98,0,112988428,0,0,0,0,15776,15742,34,0,0,0,0,0,0,8.32,33,0,1,33,15756,0.01,15555,185,0,0,0,0,0,0,0,0,0,0,3.077,-0,-0,-12,-11,-23,-36,-31,-39,22,35,19,28,,,,,1.8,2.4,2.2,2.6,1.8,2.4,2.2,2.5,37,49,45,52,36,48,44,51,15625,107,891,5.60,12528,3204,14430,1312,723,2.65,13291,2451
0x0009AEF是主键/列(第1列),但不能保证两个文件的条目(行)数相同。我使用sort wrt主键,并使用cut创建临时文件来获取所需的列(~135)。 然后是'while read'读取第一个临时文件,grep获取临时文件2上的匹配行。 如果grep失败,那么机会是关键的,或者值是不同的。因此,键和值的awk。任何更好的方法都值得赞赏。以下是当前代码-

sort --field-separator=',' --key=1 $csv1 | cut -d "," -f1,...134 | tr -d '\t' > file1
sort --field-separator=',' --key=1 $csv2 | cut -d "," -f1,...134 | tr -d '\t' > file2
while read line; do
      sl=`grep "$line" file2`
      if [ "$line" != "$sl" ]; then
         rec=`echo $line | awk -F, '{ print $1 }'`
         slId=`grep $rec file2 | awk -F, '{ print $1 }'`
         if [ "$rec" = "$slId" ]; then
               #validation failed, primary key found
         else
               #prim key not found
        fi
     else
        #all is well
     fi
done < file1
sort--fieldseparator=','--key=1$csv1 | cut-d“,“-f1,…134 | tr-d'\t'>文件1
排序--字段分隔符=','--key=1$csv2 | cut-d',“-f1,…134 | tr-d'\t'>文件2
读行时;做
sl=`grep“$line”文件2`
如果[“$line”!=“$sl”];然后
rec=`echo$line | awk-F',{print$1}'`
slided=`grep$rec file2 | awk-F',{print$1}'`
如果[“$rec”=“$slided”];然后
#验证失败,找到主键
其他的
#找不到prim密钥
fi
其他的
#一切都很好
fi
完成<文件1

<代码> > p>如果速度是关键,我会考虑使用<代码> MAWK < /代码>解析CSV文件,或者用文件示例更新帖子,这样我们可以提供更好的解决方案。 使用Bash:

IFS=, read -a line <<<"$str1"
IFS=, read -a line2 <<<"$str2"
for i in ${!line[@]}; do
    if [[ ${line[i]} != ${line2[i]} ]]; then
        echo -e "${line[i]}\n${line2[i]}"
    fi
done

1个文件中的一条记录,第一列主键-0x0009AEF,sbcd,qwer,5716192.168.17.145320192.168.17.24532012345,tyuio,14084774031408477403,,1408477722,1408477403,1408477718,2,0,5,98,0,3055925732,0,0,0,0,15756,15732,24,0,0,0,0,0,0,0.68,23,0,1,23,15776,0.00,15270,459,1,0,0,0,0,0,0,0,0,0,5.755,1408477403,1408477718,2,0,7,98,0,112988428,0,0,0,0,15776,15742,34,0,0,0,0,0,0,8.32,33,0,1,33,15756,0.01,15555,185,0,0,0,0,0,0,0,0,0,0,3.077,-0,-0,-12,-11,-23,-36,-31,-39,22,35,19,28,,,,,1.8,2.4,2.2,2.6,1.8,2.4,2.2,2.5,37,49,45,52,36,48,44,5115625107891,5.60125283204144301312723,2.65132912451最好用这些信息编辑你的帖子。将代码置于注释格式会使其难以阅读。有关如何正确设置输入/输出文件文本(代码)格式的信息,请参阅。此外,为了获得完整的解决方案,我们需要未解析文件的示例、所需输出的描述、所需输出的示例以及您当前使用的代码。由于文件的行很长,您可以提供概念上表示文件的较短示例。使用带有
grep
awk
sort
cut
的读取循环和管道无疑会非常慢。我假设在
file1
而不是
file2
中将
s1
变量设置为
grep
时会出现错误。否则,您只需创建一个重复的变量并运行一个不必要的
grep
过程
e
x