我想知道是否有办法将文件列表传递给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
答案 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)
(如果您的任何文件名包含空格,则无效。)