使用 zcat 和 sed 或 awk 编辑压缩的 .gz 文本文件

Use zcat and sed or awk to edit compressed .gz text file

我正在尝试通过删除第 2、6、10、14 行的前六个字符来编辑压缩的 fastq.gz 文本文件...我现在有两种不同的方法来执行此操作,要么使用awk 或 sed,但这些似乎只有在解压缩文件时才有效。我想在不解压缩文件的情况下编辑文件,并尝试了以下代码但没有让它工作。谢谢

使用 sed:

zcat /dir/* | sed -i~ '2~4s/^.\{6\}//'

使用 awk:

zcat /dir/* | awk 'NR%4==2 {gsub(/^....../,"")} 1'

您无法绕过压缩,但您可以以自动方式将 decompress/edit/recompress 链接在一起:

for f in /dir/*; do
  cp "$f" "$f~" &&   
  gzip -cd "$f~" | sed '2~4s/^.\{6\}//' | gzip > "$f"
done

如果您对操作很有信心,可以通过在循环体末尾添加rm "$f~"来删除备份文件。

我写了一个名为 zawk which can do this natively. It's similar to glenn jackman's answer to a duplicate of this question 的脚本,但它处理 awk 选项和几种不同的压缩机制和输入法,同时保留 FILENAMEFNR

你会像这样使用它:

zawk 'awk logic goes here' log*.gz

这没有解决 sed 的 "in-place" 标志 (-i)。