Linux 中的 Grep 和 Cut 命令

Linux 中的 Grep 和 Cut 命令

我有一个包含大量数据的 csv 文件。我希望剪切第 9 列的值 >=1,然后使用 grep 显示匹配的完整行。

样本格式:

ABC,XYZ,RTY,CREAM,FRANCE,170019,ST REMY CREME,3035540005229,0.75,1,15,26.99,10       
ABC,RDS,XSD,SPICE,NETHERLANDS,390476,THE KINGS GINGER,5010493025621,1.5,1,41,49.95,NA      
ABC,RMS,DKS,TABLE WINE RED,CHILE,400176,SANTA ISABELA,63657001349,3,1,12.5,31.99,0    

我尝试过

grep . Myfile.csv |cut -d"," -f9 | sort  |grep -E  "^(1*[1-9][2-9]*(\.[2-9]+)?|1+\.[2-9]*[1-9][2-9]*)$"

但它只显示第 9 列值,而不显示包含所有列的完整行。

并且

grep $(cut -d"," -f9 Myfile.csv | grep -E  "^(1*[1-9][2-9]*(\.[2-9]+)?|1+\.[2-9]*[1-9][2-9]*)$") Myfile.csv

任何帮助都会很棒。

PS:不能使用awk(:-

答案1

尽管您声明awk不可能 - 为了完整起见:

awk -F',' '$9>=1' input.csv 

这将指示awk将其视为,字段分隔符并仅打印字段 9 的值等于或大于 1 的行。

答案2

使用csvsql

假设您的文件 csv 文件为:

$ cat input.csv
col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11,col12,col13
ABC,XYZ,RTY,CREAM,FRANCE,170019,ST REMY CREME,3035540005229,0.75,1,15,26.99,10   
ABC,RDS,XSD,SPICE,NETHERLANDS,390476,THE KINGS GINGER,5010493025621,1.5,1,41,49.95,NA
ABC,RMS,DKS,TABLE WINE RED,CHILE,400176,SANTA ISABELA,63657001349,3,1,12.5,31.99,0

这会做:

<input.csv csvsql  --query "select * from stdin where col9 >=1 "

您可以更改col9csv 文件标题中的列名称。


使用miller

请安装磨坊主用于运行命令。

mlr --csv filter '$col9 >= 1' input.csv

答案3

尝试

grep -E "^([^,]+,){8}[1-9][0-9]*(.[1-9]+)?" MyFile.csv

在哪里

  • -E告诉grep使用扩展正则表达式
  • ^行首
  • [^,]+,匹配不是逗号,一次或多次,逗号
  • ( ){8}重复 8 次(包括尾随逗号)
  • [1-9][0-9]*(.[1-9]+)?前导非 0 可选点部分

感谢 Daniel Junglas 重复模式。

答案4

使用(以前称为 Perl_6)

raku -ne '.put if .split(",")[8] >= 1;' 

输入示例:

ABC,XYZ,RTY,CREAM,FRANCE,170019,ST REMY CREME,3035540005229,0.75,1,15,26.99,10       
ABC,RDS,XSD,SPICE,NETHERLANDS,390476,THE KINGS GINGER,5010493025621,1.5,1,41,49.95,NA      
ABC,RMS,DKS,TABLE WINE RED,CHILE,400176,SANTA ISABELA,63657001349,3,1,12.5,31.99,0 

示例输出:

ABC,RDS,XSD,SPICE,NETHERLANDS,390476,THE KINGS GINGER,5010493025621,1.5,1,41,49.95,NA      
ABC,RMS,DKS,TABLE WINE RED,CHILE,400176,SANTA ISABELA,63657001349,3,1,12.5,31.99,0

简而言之,-ne命令行标志告诉 Raku 等待代码,并按行运行它而不自动打印。逐行数据加载到$_主题变量中。该.split()调用是 的缩写$_.split,意味着 split 将对该数据起作用。

然后选择零索引的第 8列[8],并测试其数值是否为>= 1。如果是这样,则$_put,可以写成$_.put但这里缩写为.put。 (因此,如果满足条件,则整个$_输入行都会退出)。put

最后,有时“空白”未 grep 的行很有用,将匹配的行保留在同一位置。下面的 Raku 代码执行该任务,返回空白的第一行:

~$ raku -ne '.grep(*.split(",")[8] >= 1).put;'  file

ABC,RDS,XSD,SPICE,NETHERLANDS,390476,THE KINGS GINGER,5010493025621,1.5,1,41,49.95,NA      
ABC,RMS,DKS,TABLE WINE RED,CHILE,400176,SANTA ISABELA,63657001349,3,1,12.5,31.99,0    

https://raku.org

相关内容