我正在尝试在很多gziped csv文件中搜索某个字符串,该字符串位于第一行,我的想法是通过组合find,zcat和head来获取每个文件的第一行。但我不能让他们一起工作。
$find . -name "*.gz" -print | xargs zcat -f | head -1
20051114083300,1070074.00,0.00000000
xargs: zcat: terminated by signal 13
example file:
$zcat 113.gz | head
20050629171845,1069335.50,-1.00000000
20050629171930,1069315.00,-1.00000000
20050629172015,1069382.50,-1.00000000
.. and 2 milion rows like these ...
虽然我通过编写bash脚本,迭代文件并写入临时文件来解决问题,但知道我做错了什么,怎么做以及是否还有其他方法可以解决问题关于它。
答案 0 :(得分:7)
你会发现这会起作用:
find . -name "*.gz" | while read -r file; do zcat -f "$file" | head -n 1; done
答案 1 :(得分:3)
它按照你的要求工作。
head
完成了它的工作,打印了一行,然后退出了。 zcat
然后在xargs
的赞助下运行,试图写入封闭的管道并收到致命的SIGPIPE。有了孩子的死,xargs报告了为什么。
要获得所需的行为,您需要find -exec ...
构建或自定义zhead
来提供给xargs。
我在冰箱后面添加了垃圾代码:
#!/usr/bin/python
"""zhead - poor man's zcat file... | head -n
no argument error checking, prefers to continue in the face of
IO errors, with diagnostic to stderr
sample usage: find ... | xargs zhead.py -1"""
import gzip
import sys
if sys.argv[1].startswith('-'):
nlines = int(sys.argv[1][1:])
start = 2
else:
nlines = 10
start = 1
for zfile in sys.argv[start:]:
try:
zin = gzip.open(zfile)
for i in range(nlines):
line = zin.readline()
if not line:
break
print line,
except Exception as err:
print >> sys.stderr, zfile, err
finally:
try:
zin.close()
except:
pass
它在大约一分钟内处理了/ usr / share / man中的10k文件。
答案 2 :(得分:1)
如果您安装了GNU Parallel http://www.gnu.org/software/parallel/:
find . -name '*.gz' | parallel 'zcat {} | head -n1'
观看GNU Parallel的介绍视频
答案 3 :(得分:0)
zcat -r * 2>/dev/null | awk -vRS= -vFS="\n" '{print $1}'