Bash 基于列值通过shell脚本删除CSV中的行
我对shell脚本非常缺乏经验,我需要编写一个脚本,在名为Views的列包含值0时删除整行。“视图”列可能并不总是在文件中的同一位置,因此我需要一些方法来找到该列的位置。这在sed或awk中是可行的吗?或者还有什么我可以用的吗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 请注意,这只会过滤掉视图列正好
谢谢 使用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字段的值。你能给问题添加一些输入数据吗?这样我就可以看到猜测的测试数据有什么不同?它对我有用。看起来我复制错了。它现在对我有用。谢谢!