使用 sed 分割

使用 sed 分割

我必须分开

[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|||

相关内容