awk,如何根据条件传入文件列表?

时间:2017-09-20 20:10:44

标签: awk

我想知道是否有办法将文件列表传递给awk。文件列表有数千个文件,我使用grep -l查找我感兴趣的文件子集传递给awk

如,

grep -l id file-*.csv
file-1.csv
file-2.csv

$ cat file-1.csv
id,col_1,col_2
1,abc,100
2,def,200

$ cat file-2.csv
id,col_1,col_2
3,xyz,1000
4,hij,2000

如果我这样做

$ awk -F, '{print $2,$3}' file-1.csv file-2.csv | grep -v col
abc 100
def 200
xyz 1000
hij 2000

它的工作方式我想要但看到有太多的文件要手动做这样的

file-1.csv file-2.csv

我想知道是否有办法传递......

的结果
grep -l id file-*.csv

编辑:

grep -l id 

是条件。每个文件都有一个标题,但只有一些文件在标题中有'id',所以我不能在awk语句中使用文件 - * .csv通配符。

如果我在文件上做了一个ls - *。csv我最终会得到更多的文件 - 1.csv和file-2.csv。

例如,

$ cat file-3.csv 
name,col,num
a1,hij,3000
b2,lmn,50000

$ ls -l file-*.csv
-rw-r--r--  1 tp  staff  35 20 Sep 18:50 file-1.csv
-rw-r--r--  1 tp  staff  37 20 Sep 18:51 file-2.csv
-rw-r--r--  1 tp  staff  38 20 Sep 18:52 file-3.csv

$ grep -l id file-*.csv
file-1.csv
file-2.csv

3 个答案:

答案 0 :(得分:2)

根据您在“如果我这样做”下显示的输出,听起来这可能是您尝试做的事情:

Error   1   Web deployment task failed. (The database compatibility level '12' is not within the supported range of 80 to 130.)     0   0   

但你的问题不明确,所以这是猜测。

鉴于您更新的问题, awk -F, 'FNR>1{print $2,$3}' file-*.csv 的GNU awk所需要的只是:

nextfile

和任何awk(但效率低于GNU awk):

 awk -F, 'FNR==1{if ($1 != "id") nextfile} {print $2,$3}' file-*.csv

答案 1 :(得分:1)

要查找包含id字段的文件,请合并/输出其内容,不包括字段为id的行:

grep 技巧:

grep --no-group-separator -hA 1000000 'id' file-*.csv | grep -v 'id'
  • -h - 禁止输出

  • 上的文件名前缀
  • -A num - 匹配行后打印 num 行尾随上下文行。 1000000 - 被认为是最大线数,可能不会超过(如果你真的有超过1000000行的文件,你可以调整它)

输出(来自问题的2个样本文件):

1,abc,100
2,def,200
3,xyz,1000
4,hij,2000

答案 2 :(得分:1)

awk -F, 'NR > 1{print $2,$3}' $(grep -l id file-*.csv)

(如果您的任何文件名包含空格,则无效。)