【问题标题】:Add column to middle of tab-delimited file (sed/awk/whatever)将列添加到制表符分隔文件的中间(sed/awk/whatever)
【发布时间】:2012-08-14 19:38:59
【问题描述】:

我正在尝试将一列(内容为“0”)添加到预先存在的以制表符分隔的文本文件的中间。我想sedawk 会做我想做的事。我在网上看到了各种解决方案,它们大致可以做到这一点,但它们的解释不够简单,我无法修改!

我目前有这个内容:

Affx-11749850   1       555296  CC

我需要这个内容

Affx-11749850   1   0   555296  CC

使用命令 awk '{$3=0}1' 文件名会打乱我的格式并将第 3 列替换为 0,而不是使用 0 添加第三列。

任何帮助(有解释!),以便我可以解决这个问题以及未来的类似问题,非常感谢。

【问题讨论】:

  • 一个相关问题 - 该文件有 280 列,我想在第一列和第二列之间切换,切我不知道如何在不输入某种大量打印语句的情况下实现这一点277 美元、278 美元、279 美元……

标签: sed awk


【解决方案1】:

使用隐式{ print } 规则并将0 附加到第二列:

awk '$2 = $2 FS "0"' file

或者使用sed,假设单个空格分隔符:

sed 's/ / 0 /2' file

perl:

perl -lane '$, = " "; $F[1] .= " 0"; print @F'

【讨论】:

  • 一个非常相似的 AWK 选项将分隔符留给 AWK 将是 awk '{$5=$4;$4=$3;$3=0}1' 出于这个原因我更喜欢这个
  • 对我来说awk 不保留实际的FS,而是使用空间(默认)。所以为了保持文件制表符分隔,我必须这样做awk '$2 = $2 "\t0"' file
  • 如果文件是制表符分隔的,请告诉awkawk -F'\t' '$2 = $2 FS "0"' file 按预期工作。
  • 谢谢,我选择了 awk '$2 = $2 FS "0"'
  • sed 解决方案很好,并且可以简化(也保持给定示例中的间距):sed 's/./0/21' 将用0 替换第 21 个字符。
【解决方案2】:
awk '{$2=$2" "0; print }' your_file

测试如下:

> echo "Affx-11749850 1 555296 CC"|awk '{$2=$2" "0;print}'
Affx-11749850 1 0 555296 CC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2012-10-05
    • 2021-06-10
    • 1970-01-01
    相关资源
    最近更新 更多