使用 awk/for/grep 比较 2 个文件

使用 awk/for/grep 比较 2 个文件

我有 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.csvimpo1.csvexpo1.csvp2_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,然后grepexpo1.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

相关内容