如何比较两个文件的第一列,如果字符串匹配则打印“true”

如何比较两个文件的第一列,如果字符串匹配则打印“true”

我有两个文件,即 file1 和 file2。

file1:

91 | 2018-10-11 16:07:14 | bkwdv | 188.0000 |
77 | 2018-10-12 15:05:15 | wvwef | 94.0000  | 

file2:

77 | 2018-10-12 15:05:15 | wvwef | 94.0000  
91 | 2018-10-11 16:07:14 | bkwdv | 188.0000 

我想将 file1 的第一列与 file2 的第一列进行比较。

如果字符串匹配(无论顺序如何,如给定的输入数据),它应该打印“成功”,否则“退出”。因此,根据给定的输入数据,它应该打印“成功”。

请注意,两个文件中第一列的行数可能有所不同,因此在这种情况下,它应该退出。

答案1

从每个文件中提取第一列,对它们进行数字排序,然后比较它们:

awk '{ print $1 }' <file1 | sort -n >file1.col1
awk '{ print $1 }' <file2 | sort -n >file2.col1

if cmp -s file1.col1 file2.col1; then
    echo 'success'
else
    echo 'exit'
fi

rm file1.col1 file2.col1

或者,使用bash特定语法:

if cmp -s <( awk '{ print $1 }' <file1 | sort -n ) \
          <( awk '{ print $1 }' <file2 | sort -n )
then
    echo 'success'
else
    echo 'exit'
fi

cmp -s命令不会输出任何内容,但如果两个文件操作数具有相同的内容,则会成功退出。我们在if语句中使用它来确定两个文件的排序第一列是否相同。

awk '{ print $1 }'cut -d ' ' -f 1如果第一列中的数字后面的空白字符是空格字符,则上面代码中的内容也可以替换为空格字符。

答案2

和我对你问题的回答类似这里

#!/bin/bash
var=$(cut -d"|" -f 1 file  | sort -k1.1n)
var1=$(cut -d"|" -f 1 file | sort -k1.1n)

if [ "$var" == "$var1" ]
then
  echo "success"
else
  exit
fi

解释

答案3

您可以使用 检查排序文件中不可配对的行join,并测试结果是否为空字符串:

[[ -z "$(join -t '|' -v1 -v2 <(sort file1) <(sort file2))" ]] && echo "success" || echo "exit"

答案4

那么在这样的条件下

  1. 猫两个文件
  2. 排序 -n 唯一
  3. 计算结果行数

如果您获得的数字与两个文件中的行数相同,那么您就成功了。

N1=$(cat file1 |wc -l) ;N2=$(cat file2 |wc -l); N3=$(cat file1 file2 |sort -nu |wc -l); echo $N1 $N2 $N3

如果你需要得到结果: success / exit ,你必须自己比较 N1、N2、N3。当然,建议在开始收集结果 N3 之前先比较 N1 和 N2,如果相等,然后继续,则只比较 N1 和 N3(因为您开始计算 N3,这就是为什么 N1==N2) 。

相关内容