Shell脚本:检查两个CSV文件中“X”列中的数据是否匹配

时间:2017-11-26 11:06:35

标签: bash awk sed

例如我有

a.txt

1 21 34
1 22 21
2 32 76
2 12 76
...

b.txt

1 99 73
1 32 27
2 55 76
2 76 12
...

预期产出:

$ ./some_script 1 a.txt b.txt
0 # matched
# compare data in #1 column of a.txt to data in #1 column of b.txt
# data: a.txt  b.txt
#       1      1
#       1      1
#       2      2
#       2      2
$ ./some_script 2 a.txt b.txt
1 # not matched
$ ./some_script 3 a.txt b.txt
1 # not matched

其中参数123是列号。

让我们说,some_script只是对文件a.txtb.txt中同一列中的数据进行了比较。

我需要一些用bashsedawk(或其他可能的程序)编写的程序来完成这项工作。

4 个答案:

答案 0 :(得分:3)

我会使用pasteawk的组合来实现

#!/bin/bash
[ -z "$1" -o -z "$2" -o -z "$3" ] && echo "Not enough arguments" && exit 1
[ ! -f "$2" -o  ! -f "$3" ] &&  echo "input file(s) don't exist" && exit 1

awk -v var="$1" '$var!=$(NF/2+var){flag=1;exit}
                 END{print flag;}' <(paste "$2" "$3")

将文件另存为compare.sh,使其成为可执行文件,然后像

一样运行
./compare.sh 3 a.txt b.txt

答案 1 :(得分:2)

[ "$(cut -d' ' -f1 a.txt)" = "$(cut -d' ' -f1 b.txt)" ]; echo $?

<强>解释

  1. [ "string1" = "string2" ] - 测试命令。如果string1等于string2,则返回0,否则返回1。有关其他信息,请参阅man test
  2. cut -d' ' -f1 a.txt - 剪切文件a.txt中的第一列。
    • -d' ' - 将字段分隔符设置为空格。
    • -f1 - 仅选择字段编号1。在这种情况下,您可以使用变量而不是数字1,例如num=1; [ "$(cut -d' ' -f$num a.txt)" = "$(cut -d' ' -f$num b.txt)" ]; echo $?
  3. echo $? - 打印上次执行程序的退出状态。

答案 2 :(得分:1)

简单的一行解决方案,包含bash和awk

#!/bin/bash
[ "$(awk -F' ' "{print \$$1}" "$2")" == "$(awk -F' ' "{print \$$1}" "$3")" ] && echo 0 || echo 1

<强>输出

./script 1 a.txt b.txt
0
./script 2 a.txt b.txt
1
./script 3 a.txt b.txt
1

答案 3 :(得分:0)

这是使用自定义文件描述符和数组的bash版本:

packagingOptions{
    exclude 'builddef.lst'
    exclude 'version.txt'
    exclude 'isoparser-default.properties'
}