我有以下文本文件,我需要比较每行的值,即项目2-4与项目5-7.我坚持使用bash/awk/sed.
样本数据:
[hartford tmp]$ cat flist
a1 1 2 3 x y z
b1 3 2 1 z y x
c1 1 2 3 1 2 3
d1 4 5 6 6 5 4
e1 a b c a b c
f1 x y z x y z
Run Code Online (Sandbox Code Playgroud)
它适用于以下脚本,但它只是无法忍受的缓慢,可能是因为所有的echos.
[hartford tmp]$ cat pdelta.sh
#!/bin/bash
cat flist |while read rec; do
f1="$(echo $rec | awk '{ print $1 }')"
f2="$(echo $rec | awk '{ print $2 }')"
f3="$(echo $rec | awk '{ print $3 }')"
f4="$(echo $rec | awk '{ print $4 }')"
f5="$(echo $rec | awk '{ print $5 }')"
f6="$(echo $rec | awk '{ print $6 }')"
f7="$(echo $rec | awk '{ print $7 }')"
if [[ "x${f2} x${f3} x${f4}" != "x${f5} x${f6} x${f7}" ]]; then
echo "$f1 DOES NOT MATCH"
fi
done
Run Code Online (Sandbox Code Playgroud)
在运行时,输出正是我正在寻找的,但是在处理50k +行长的文件时它太慢了.
[hartford]$ ./pdelta.sh
a1 DOES NOT MATCH
b1 DOES NOT MATCH
d1 DOES NOT MATCH
Run Code Online (Sandbox Code Playgroud)
有什么更有效的方法来实现这一目标?
您可以使用awk输出所有匹配的ID:
awk '{ if ($2 == $5 && $3 == $6 && $4 == $7) { print $1 } }' < flist
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用read分配变量:
$ while read f1 f2 f3 f4 f5 f6 f7; do stuff; done <flist
Run Code Online (Sandbox Code Playgroud)