我有 2 个 csv 文件,其内容是-
expo1.csv
:
102,伟大,形容词,ENG,p1_0,否,p2_1,否,p3,否,4,是,p5_2,否,p6,是......,su1,amb,su_09,否
104、BHAAG,动词,HIN,p1,是,p2,否,p3_7,amb,p4,否,p5,否,p6_9,是......,sg4_3,是,su119,amb
110,.......,su11_0,amb
和
impo1.csv
:
104,p1,no
102,p2,yes
104,p10,no
110,su11,no
基本上expo1.csv
是服务器上的一个文件,并且impo1.csv
是我创建的用于更新的文件expo1.csv
。在对 impo1 数据执行轻微处理后,脚本会expo1.csv
按照 中指定的进行更改(例如,处理 102,p2,yes 行,然后对-进行更新。)impo1.csv
impo1.csv
expo1.csv
p2_1,yes
expo1.csv
更改后:
102,伟大,形容词,ENG,p1_0,否,p2_1,是,p3,否,4,是,p5_2,否,p6,是......,su1,amb,su_09,否
104、BHAAG,动词,HIN,p1,否,p2,否,p3_7,amb,p4,否,p5,否,p6_9,是......,sg4_3,是,su119,amb
110,.........,su11_0,没有
现在,在脚本进行更改后,我们需要通过比较 impo1 和 expo1 文件来验证更改是否正确完成。这就是我被困住的地方。
到目前为止,我可以使用以下方法将逗号之间的数据impo1.csv
单独隔离到变量中awk
:
Sno=104 102 104
Posw=p1 p2 p10
cho=no yes no
现在的问题是,我该如何检查呢?这些impo1.csv
文件包含大约 3000 个更新。如果我grep p1 expo1.csv|grep no expo1.csv
,显然它不会返回正确的结果,因为文件有许多“否”字符串。我尝试使用 for 循环将数据分离awk
为单独的变量,然后使用通配符 grep - grep sno expo1.csv|grep '/<$posw.*,$cho>/' expo1.csv
- 但它不起作用。
使用 GNU bash 4.1.2。
编辑 - 应该早点提到这一点,我的错 - impo1.csv 文件中没有明确的模式,我可以用它来检查 expo1 文件。我对示例文件内容进行了更正,以说明我的观点。
答案1
解决方案相当简单。您只需要从每一行创建一个模式impo1.csv
,然后grep
在expo1.csv
更新后创建一个模式
validate() {
# $1 ~ impo1.csv
# $2 ~ expo1.csv after changes
while read pattern; do
grep -q "^$pattern" $2 || return 1
done < <(sed "s/,/,.*/" $1 )
}
答案2
awk -F, '
NR==FNR{
for(i=1;i<NF;i)
DATA[$1 SUBSEP $++i] = $++i;
next
}
DATA[$1 SUBSEP $2] != $3
' expo1.csv impo1.csv
impo1.csv
将打印与数据不同的行expo1.csv