在Linux中运行查询以选择CSV'S

问题描述 投票:0回答:3

在Linux中:

文件夹中有很多.csvs',我必须选择那些列名为''PREDICT'= 646}的csv文件。

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

什么样的查询有效?

linux bash unix awk
3个回答
1
投票

提供未提供的测试数据):

$ cat > file1
ACTUAL PREDICT
1 2
3 646

$ cat > file2
ACTUAL PREDICT
1 2
3 666

然后一些GNU awk(nextfile)选择那些具有列名{'PREDICT'= 646}的csv文件或者有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
投票

你可以尝试一下,让我知道这是否对你有帮助。

解决方案1:简单地读取1个文件并在标题中出现字符串“PREDICT”的相同字段/地方的任何行中打印具有646值的整行。

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

解决方案第二:如果您必须检查字符串“PREDICT”的字段编号,那么以下文件可能会对您有所帮助。

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文件对字符串“PREDICT”具有相同的位置,那么以下内容可能会对您有所帮助。

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","


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
© www.soinside.com 2019 - 2024. All rights reserved.