【问题标题】:Use zcat and sed or awk to edit compressed .gz text file使用 zcat 和 sed 或 awk 编辑压缩的 .gz 文本文件
【发布时间】:2015-02-17 17:44:26
【问题描述】:

我正在尝试通过删除第 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'

【问题讨论】:

  • 您不能就地编辑压缩文件。您必须解压缩它,编辑它,然后重新压缩它。此外,无论压缩如何,sed -i 都无法使用管道 - 它无法以这种方式回写。必须是命名文件。

标签: bash awk sed


【解决方案1】:

您无法绕过压缩,但可以自动将解压缩/编辑/重新压缩链接在一起:

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

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

【讨论】:

    【解决方案2】:

    我编写了一个名为zawk 的脚本,它可以在本地执行此操作。它类似于glenn jackman's answera duplicate of this question,但它处理awk 选项和几种不同的压缩机制和输入法,同时保留FILENAMEFNR

    你会像这样使用它:

    zawk 'awk logic goes here' log*.gz
    

    这不解决 sed 的“就地”标志 (-i)。

    【讨论】:

      猜你喜欢
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多