2017-09-23 83 views
0

在Linux:运行在Linux上查询选择CSV'S

有很多.csvs'的文件夹中,我要选择那些CSV的有文件列名{‘PREDICT’= 646}。

检查此链接: https://prnt.sc/gone85

什么样的查询工作?

+2

请看:https://stackoverflow.com/questions/2373885/searching-a-csv-file-using-grep –

+0

您想运行的代码在多个文件中找到?我想要求你在你的文章中提到更清楚的细节,请帮助我们帮助你,享受学习! – RavinderSingh13

+0

你是什么意思与*选择** **那些CSV的*? – RomanPerekhrest

回答

0

请问您是否可以试试以下内容,并告诉我这是否对您有所帮助。

解决方案第一:为了简单地读取文件1和打印其具有在相同的字段/地方字符串“预测”的任何线646值存在于报头中的整行。

awk 'NR==1{for(i=1;i<=NF;i++){if($i == "PREDICT"){val=i}};next} $val==646' Input_file 

解决第二:如果你必须检查串的场数“预测”的每个文件,然后以下可能会帮助你。

awk 'FNR==1{if(FILE){close(FILE)};for(i=1;i<=NF;i++){if($i == "PREDICT"){val=i}};FILE=FILENAME;next} $val==646{print;nextfile}' *.csv 

解决方案3:如果你所有的.csv文件对字符串相同的位置“预测”,那么下面可以帮助你。

awk 'NR==1{for(i=1;i<=NF;i++){if($i == "PREDICT"){val=i}};if(FILE){close(FILE)};next} FNR==1{if(FILE){close(FILE)};FILE=FILENAME} $val==646{print;nextfile}' *.csv 

如果您的.csv INPUT_FILE是有任何字段分隔符,那么你可以设置-F如 - >awk -F","上相同。

1

提供这是未拨备测试数据):

$ cat > file1 
ACTUAL PREDICT 
1 2 
3 646 

$ cat > file2 
ACTUAL PREDICT 
1 2 
3 666 

然后一些GNU AWK(nextfile选择那些CSV的具有文件列名称{ 'PREDICT'= 646}或其中存在PREDICT柱,用值646

$ awk 'FNR==1{for(i=1;i<=NF;i++)if($i=="PREDICT")p=i}$p==646{print FILENAME;nextfile}' file1 file2 
file1 

解释:

awk ' 
FNR==1 {     # get the column number of PREDICT column for each file 
    for(i=1;i<=NF;i++) 
     if($i=="PREDICT") 
      p=i   # set it to p 
} 
$p==646 {     # if p==646, we have a match 
    print FILENAME   # print the filename 
    nextfile    # and move on to the next file 
}' file1 file2    # all the candicate files 
0

GNU AWK溶液不循环:

$ cat tst.awk 
BEGIN{FS=","} 
FNR==1 && s=substr($0,1,index($0,"PREDICT")) { # look for index of PREDICT 
    i=sub(/,/, "", s) + 1      # and count nr of times you 
               # can replace "," in preceding 
               # substring 
} 
s && $i==646 { print FILENAME; nextfile } 

一些输入:

$ cat file1.csv 
ACTUAL,PREDICT,COUNTRY,REGION,DIVISION,PRODUCTTYPE,PRODUCT,QUARTER,YEAR,MONTH 
925,850,CANADA,EAST,EDUCATION,FURNITURE,SOFA,1,1993,12054 
925,533,CANADA,EAST,EDUCATION,FURNITURE,SOFA,1,1993,12054 
925,646,CANADA,EAST,EDUCATION,FURNITURE,SOFA,1,1993,12054 

$ cat file2.csv 
ACTUAL,PREDICT,COUNTRY,REGION,DIVISION,PRODUCTTYPE,PRODUCT,QUARTER,YEAR,MONTH 
925,850,CANADA,EAST,EDUCATION,FURNITURE,SOFA,1,1993,12054 
925,533,CANADA,EAST,EDUCATION,FURNITURE,SOFA,1,1993,12054 
925,111,CANADA,EAST,EDUCATION,FURNITURE,SOFA,1,1993,12054 

和:

$ cp file1.csv file3.csv 

给出:

$ awk -f tst.awk *.csv 
file1.csv 
file3.csv 

或者使用一个班轮:

$ awk -F, 'FNR==1 && s=substr($0,1,index($0,"PREDICT")) {i=sub(/,/, "", s) + 1}s && $i==646 { print FILENAME; nextfile }' *.csv 
file1.csv 
file3.csv