Bash 基于列值通过shell脚本删除CSV中的行

Bash 基于列值通过shell脚本删除CSV中的行,bash,shell,csv,awk,sed,Bash,Shell,Csv,Awk,Sed,我对shell脚本非常缺乏经验,我需要编写一个脚本,在名为Views的列包含值0时删除整行。“视图”列可能并不总是在文件中的同一位置,因此我需要一些方法来找到该列的位置。这在sed或awk中是可行的吗?或者还有什么我可以用的吗 谢谢 使用awk,可以这样做: awk -F, 'NR == 1 { for(i = 1; i <= NF; ++i) { col[$i] = i }; next } $col["Views"] != 0' filename.csv 请注意,这只会过滤掉视图列正好

我对shell脚本非常缺乏经验,我需要编写一个脚本,在名为Views的列包含值0时删除整行。“视图”列可能并不总是在文件中的同一位置,因此我需要一些方法来找到该列的位置。这在sed或awk中是可行的吗?或者还有什么我可以用的吗


谢谢

使用awk,可以这样做:

awk -F, 'NR == 1 { for(i = 1; i <= NF; ++i) { col[$i] = i }; next } $col["Views"] != 0' filename.csv

请注意,这只会过滤掉
视图
列正好为0的行。如果还想筛选出
视图
字段为空的行,请使用
$col[“视图”]
而不是
$col[“视图”!=0

使用awk,可以这样做:

awk -F, 'NR == 1 { for(i = 1; i <= NF; ++i) { col[$i] = i }; next } $col["Views"] != 0' filename.csv
awk -F ',' 'NR==1{print;for(i=1;i<=NF;++i){if($i=="Views"){x=$i;y=i}}};NR>1{if($y!=0){print}}'  file > new_file
请注意,这只会过滤掉
视图
列正好为0的行。如果还想筛选出
视图
字段为空的行,请使用
$col[“视图”]
而不是
$col[“视图”!=0

awk-F','NR==1{print;for(i=1;i1{if($y!=0){print}'文件>新建
awk -F ',' 'NR==1{print;for(i=1;i<=NF;++i){if($i=="Views"){x=$i;y=i}}};NR>1{if($y!=0){print}}'  file > new_file
代码分解

NR==1{                    #for the first line 
print                     #print it 
for(i=1;i<=NF;++i){       #make a loop to read all the column and find the 
    if($i=="Views"){      #name "Views" in the first row. 
        y=i               #Save the column number in a variable named y
    }
}
}

NR>1{                     # start from line 2 going downwards targeting
     if($y!=0){           # the Views Column
       print              #if it does not contain 0, print the line
     }
}
NR==1{#用于第一行
打印出来
对于(i=1;i1{#从第2行开始向下
如果($y!=0){#视图列
打印#如果不包含0,则打印该行
}
}
awk-F','NR==1{print;for(i=1;i1{if($y!=0){print}}文件>新建
代码分解

NR==1{                    #for the first line 
print                     #print it 
for(i=1;i<=NF;++i){       #make a loop to read all the column and find the 
    if($i=="Views"){      #name "Views" in the first row. 
        y=i               #Save the column number in a variable named y
    }
}
}

NR>1{                     # start from line 2 going downwards targeting
     if($y!=0){           # the Views Column
       print              #if it does not contain 0, print the line
     }
}
NR==1{#用于第一行
打印出来
对于(i=1;i1{#从第2行开始向下
如果($y!=0){#视图列
打印#如果不包含0,则打印该行
}
}
#如果第一列=badString或has.(点),请不要将其包含在输出文件中


#如果第一列=badString或has。(点)不要将其包含在outputfile中

您可以显示输入和输出示例吗?我特别想看看标题的格式。@Wintermute嘿,是的,所以它只是一个标准的CSV。标题是文件的第一行:日期,…,视图,…,URL。示例输出将是完全相同的CSV文件,只是从中删除了0个视图的行你能展示输入和输出的例子吗?我想看看标题的格式,尤其是。@Wintermute嘿,是的,所以它只是一个标准的CSV。标题是文件的第一行:日期,…,视图,…,URL。示例输出将是完全相同的CSV文件,只是删除了0个视图的行。这看起来不错,但唯一的问题是它只是在控制台上输出。我需要从文件中物理删除这些行。awk是否可能做到这一点?对于GNU awk 4.1.0或更高版本,在这里使用
awk-I代替与之前相同的\u
。或者,因为如果电源在错误的时刻断开,有一个备份是很好的,
cp foo.csv foo.csv~&&awk same\u_在foo.csv~>foo.csv
之前。看起来这些行没有被跳过。我们确定这部分正确吗?col[$i]=i是字段的索引,不是吗?所以$col[“Views”]将设置为索引,而不是该列中包含的实际值,这是需要针对文件中的每行0进行检查的
$i
不是
i
的值,而是
i
第th字段的值。同样,
$col[“视图”]
col[“视图”]的值
th字段。你能给问题添加一些输入数据吗?这样我就可以看到我猜测的测试数据中有什么不同?这对我来说很有效。看起来我复制错了。现在对我有效。谢谢!这看起来很好,但唯一的问题是它只是在控制台上输出。我需要从文件中物理删除这些行。这是可能的吗使用awk进行备份?使用GNU awk 4.1.0或更高版本,在这里使用
awk-i替换与前面相同的\u
。或者,因为有一个备份以防电源在错误的时刻断开很好,
cp foo.csv foo.csv~&&awk替换与前面相同的\u foo.csv~>foo.csv
。看起来这些行没有被跳过。我们确定这部分正确吗[$i]=i i是字段的索引,不是吗?因此,$col[“Views”]将被设置为索引,而不是该列中包含的实际值,这是需要针对文件中每行0进行检查的内容
$i
不是
i
的值,而是
i
第个字段的值。同样,
$col[“Views”]
col[“Views”]
th字段的值。你能给问题添加一些输入数据吗?这样我就可以看到猜测的测试数据有什么不同?它对我有用。看起来我复制错了。它现在对我有用。谢谢!