如果前一行匹配,则使用Bash csv删除行

时间:2015-04-12 06:21:02

标签: bash awk

我有一个像这样的csv文件:

"a", "b", "c" 
"1", "b", "4"
"3", "g", "f"

只要"b"出现在与两个连续行中的第二列值相同的位置,我想删除第二行,从而导致:

"a", "b", "c" 
"3", "g", "f"

这至少让我开始解析:

awk -F "," '$1' file.csv

2 个答案:

答案 0 :(得分:8)

只要第二列重复,就会删除一行:

$ awk -F, '$2==last{next} {last=$2} 1' file.csv
"a", "b", "c" 
"3", "g", "f"

如何运作

  • $2==last{next}

    如果第二列$2等于上一个第二列last,则跳过此列并转到next行。

  • last=$2

    更新last

  • 的值
  • 1

    这是"打印线"的隐秘速记。

变化1

如果我们只想删除第二列等于"b"的行,那就是重复上一行,那么:

awk -F, '$2==last && $2==" \"b\"" {next} {last=$2} 1' file.csv

变体2

假设我们只想每隔一次"b"删除行:

awk -F, '$2==last && $2==" \"b\"" {last="";next} {last=$2} 1' file.csv

变体3

假设我们想跳过第"b"个第二列的任何一行,如果它后跟一行具有相同的第二列。然后:

awk -F, '$2==last && $2==" \"b\"" {line=$0;next} NR>1{print line} {last=$2;line=$0} END{print line}' file.csv

答案 1 :(得分:0)

试试这个:

awk -F', ' 'BEGIN{OFS=FS} {
    if ($2 == "\"b\"") { 
        if (!var) {
            print
            var=1
        } else {
            var=""
        }
    } else {
        print
        var=""
    }
}' files.csv