【问题标题】:Adding a column to multiple files (900+) using #SBATCH使用 #SBATCH 向多个文件 (900+) 添加一列
【发布时间】:2020-08-11 02:31:41
【问题描述】:

我正在尝试向文件中添加一列:

1       12098   12258   0.00
1       12553   12721   1.37
1       13331   13701   34.69
1       30334   30503   0.00
1       35045   35544   0.00
1       35618   35778   0.00
1       69077   70017   0.24
1       324294  324394  0.68
1       324427  325605  3.18

所以它看起来像这样:

1       12098   12258   unknown   0.00
1       12553   12721   unknown   1.37
1       13331   13701   unknown   34.69
1       30334   30503   unknown   0.00
1       35045   35544   unknown   0.00
1       35618   35778   unknown   0.00
1       69077   70017   unknown   0.24
1       324294  324394  unknown   0.68
1       324427  325605  unknown   3.18

我已经用这个命令做到了:

awk '$3 = $3 FS "unknown"' <file> > <new_file>

但是,我也有 900 多个文件需要执行此操作,并且每次都输出到一个新文件。我发现 awk 理解起来很复杂,想知道是否有办法使用#SBATCH 脚本或任何其他方法一次处理多个文件?

我对堆栈溢出还很陌生,所以任何帮助都将不胜感激!谢谢!

【问题讨论】:

  • 保留列间距对您来说很重要吗?如果是这样,那是标签或空白还是其他什么?

标签: awk sed terminal sbatch


【解决方案1】:

这是一个替代sed 解决方案,用于进行此更改并内联保存更改:

sed -E -i.bak 's/[^[:blank:]]+$/unknown &/' *.txt

【讨论】:

  • 嗨@anubhava,谢谢!它运作良好。我想知道是否可以仅对单独文件中列出的文件名执行此命令?再次感谢
  • 假设文件名存储在一个名为 files.txt 的文件中,那么您可以使用:sed -E -i.bak 's/[^[:blank:]]+$/unknown &amp;/' $(&lt;files.txt)
  • 太棒了!谢谢@anubhava 工作得很好!最后一个问题,你可以让 sed 在后台工作吗?
  • 是的,只需将&amp; 放在命令末尾,例如:sed -E -i.bak 's/[^[:blank:]]+$/unknown &amp;/' $(&lt;files.txt) &amp;
【解决方案2】:

编辑:根据 OP 的 cmets 添加解决方案以将输出保存到输出文件中尝试以下操作。

awk '
FNR==1{
  close(out_file)
  sub(/\./,"_new&",FILENAME)
  out_file=FILENAME
}
{
  $NF="unknown" OFS $NF
  print > (out_file)
}'  *.bed


如果您不担心行之间的空格,那么您可以尝试以下操作。

awk '{$NF="unknown" OFS $NF} 1'  Input_file

或者使用 GNU awk 最新版本试试:

gawk -i inplace -v INPLACE_SUFFIX=.bak '{$NF="unknown" OFS $NF} 1'  Input_file(s)


为了让空间看起来不错,你也可以在上面的命令中添加column

awk '{$NF="unknown" OFS $NF} 1'  Input_file | column -t

或者使用 GNU awk 最新版本试试:

gawk -i inplace -v INPLACE_SUFFIX=.bak '{$NF="unknown" OFS $NF} 1'  Input_file | column -t

【讨论】:

  • 感谢您的建议。我想同时为多个文件执行此操作有没有办法做到这一点?谢谢
  • @hdjc90,如果你有最新版本的 GNU awk,它也有文件备份的就地保存,删除备份文件选项-v INPLACE_SUFFIX=.bak,以防你不想备份文件,让我知道?
  • 嗨@RavinderSingh13 感谢您的帮助。澄清一下,我想输入一个命令来处理我的所有文件(例如 *.bed)并将它们全部输出(例如 *_new.bed)?
  • @hdjc90,您能否检查一下我的 EDIT 解决方案,让我知道这是否对您有帮助?
猜你喜欢
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 2019-12-31
  • 2016-05-06
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
相关资源
最近更新 更多