提供未提供的测试数据):
$ 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
你可以尝试一下,让我知道这是否对你有帮助。
解决方案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","
。
没有循环的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