我必须分开
[X] ||| you owns the [X,1] ||| you own the [X,1] ||| 1 0.02020 0.07847 0.36788 3 -0.00000 -0.00000
在管道处并输出第二个和第三个参数不同的那些行。
答案1
@manatwork 评论/答案的一些解释:
grep
版本:grep '^[^|]\+|||\(.\+\?|||\)\1'
^
: 匹配行的开头[^|]
:匹配除此之外的任何字符|
\+
:匹配前面的模式一次或多次|||
: 匹配您的分隔符\(
and\)
:将括号内匹配的值保存在\1
.
: 匹配任意字符\+\?
:一次或多次,但非贪婪|||
: 再次匹配你的分隔符\1
:匹配括号内之前看到的文本
这里的想法是跳过行的开头直到第一个分隔符,然后保存找到的值直到第二个分隔符的末尾,然后仅匹配与第二个运算符之后具有完全相同值的行
\1
(即第三个字段)sed
版本:sed -n '/^[^|]\+|||\(.\+\?|||\)\1/p'
与 相同的含义
grep
,在行的开头和结尾处附加一个/
来指示模式,并p
在末尾加上一个额外的命令字符来打印匹配的行。awk
版本:awk -F'\\|\\|\\|' '$2==$3'
-F'\\|\\|\\|'
:表示字段分隔符:|||
在这种情况下转义'$2==$3'
:仅过滤第二个和第三个字段相等的输入
答案2
我更喜欢这个awk
解决方案,但如果你只想使用 Bash,这是我的答案:
foo()
{
local filename="$1";
[[ $filename ]] || return 1
while read -r line; do
l="${line#*|||}"; a2="${l%%|||*}"
l="${l#*|||}"; a3="${l%%|||*}"
[[ $a2 = $a3 ]] && echo "$line"
done < "$filename"
}
用法: foo filename.txt
示例输出:
rany$ cat > filename.txt
a|||b|||c|||d|||
a|||b|||c|||d|||
a|||E|||E|||d|||
a|||B|||B|||d|||
rany$ foo filename.txt
a|||E|||E|||d|||
a|||B|||B|||d|||