【问题标题】:replace column header for multiple tab delimited files替换多个制表符分隔文件的列标题
【发布时间】:2016-11-01 10:33:24
【问题描述】:

我有 100 多个具有相同列名的制表符分隔文件。我想将所有文件中的一个列名(第 2 列)从“OLD”更改为“NEW”。文件中的其余内容保持不变。
谁能帮助我如何使用 awk 做到这一点?

例如。文件.txt

INFO    OLD    CONF     DB     COSMIC
NA      NA      9       .       53
NA      NA      10      .       192
NA      NA      8       .       41
NA      NA      8       .       87
NA      NA      8       .       94
NA      NA      8       .       92
NA      NA      10      .       192
NA      NA      10      .       47
NA      NA      10      .       87

我想将“旧”更改为“新”:

   INFO    NEW    CONF     DB      COSMIC
    NA      NA      9       .       53
    NA      NA      10      .       192
    NA      NA      8       .       41
    NA      NA      8       .       87
    NA      NA      8       .       94
    NA      NA      8       .       92
    NA      NA      10      .       192
    NA      NA      10      .       47
    NA      NA      10      .       87

我试过下面的脚本

#!/bin/bash
for file in 'ls PATH';
do
     awk 'NR==1 && $2=="OLD"{$2=="NEW"}1' $file > temp && mv temp $file
done

【问题讨论】:

  • 一个例子将有助于获得更多答案。
  • 什么是分隔符?任何空白,仅限制表符?
  • 它是一个制表符分隔的文件,包含三列“名称”“新”“值”。我无法在此处以表格格式提供示例数据。你能建议怎么做吗?
  • 现在在上面的主帖中添加了一个示例文件。
  • $2=="NEW" 应该是 $2="NEW"

标签: unix awk


【解决方案1】:

这是sed中的一种方法

$ sed -i'.bak' -r '1s/([^\t]*\t)OLD/\1NEW/' file

如果您想就地更改文件,sed 是更好的选择。您可以在一个循环中完成所有操作

$ for f in files; do sed -i'.bak' -r ... $f; done

awk替代可以

$ awk -v OFS='\t' 'NR==1 && $2=="OLD"{$2="NEW"}1' file > temp && mv temp file

【讨论】:

  • mv: `temp' 后缺少目标文件操作数
  • 那里不应该有重定向,已修复。
  • 我现在添加了一个示例测试文件和预期输出文件,以及一个代码。我已经编辑了顶部的主要帖子。可以看看吗?
猜你喜欢
  • 2011-10-02
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
相关资源
最近更新 更多