Linux 中的 Grep 和 Cut 命令

San*_*uri 0 grep bash gnu cut csv

我有一个包含大量数据的 csv 文件。我希望为值 >=1 剪切第 9 列,然后使用 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    
Run Code Online (Sandbox Code Playgroud)

我试过

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

但它只显示第 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
Run Code Online (Sandbox Code Playgroud)

任何帮助都会很棒。

PS:不能使用 awk (:-

Adm*_*Bee 13

虽然您声明awk不是一种可能性 - 为了完整起见:

awk -F',' '$9>=1' input.csv 
Run Code Online (Sandbox Code Playgroud)

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


Pra*_*ngh 8

使用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
Run Code Online (Sandbox Code Playgroud)

这会做:

<input.csv csvsql  --query "select * from stdin where col9 >=1 "
Run Code Online (Sandbox Code Playgroud)

您可以更改col9csvfile 中标题中的列名。


使用miller

请安装miller来运行命令。

mlr --csv filter '$col9 >= 1' input.csv
Run Code Online (Sandbox Code Playgroud)