使用 awk 将一列添加到三列文件中

使用 awk 将一列添加到三列文件中

我想使用 awk 将新列添加到 file.txt 中的现有矩阵中。我有文件

  -1.664405      -0.019498       0.487501
  -2.210156       0.326547       1.193717
  -2.260318      -0.104277      -0.256821
   2.189078      -2.103898       1.321050
   1.558565      -1.476110       0.967988
   1.764428      -2.955372       1.216211
   ...
   ...

我想要这样的东西

O     -1.664405      -0.019498       0.487501
H     -2.210156       0.326547       1.193717
H     -2.260318      -0.104277      -0.256821
O      2.189078      -2.103898       1.321050
H      1.558565      -1.476110       0.967988
H      1.764428      -2.955372       1.216211
    ...
    ...

O和H必须以这种形式系统地变化数百次。

有人知道如何用 awk 做到这一点吗?提前致谢

答案1

我不清楚您想要多少缩进,因此我假设新的第一列和后续列之间只有一个空格。

如果必须的话,awk你可以这样做:

awk '(NR-1)%3{print "H", $0; next}{print "O", $0}'

sed也可以使用其他方法:

sed '1~3{s/^/O /p;d};s/^/H /'

答案2

awk '{ print (FNR-1) % 3 ? "H" : "O", $0 }' file

这用于awk在当前行前加上 anH或 an前缀O,具体取决于当前行的行号是否是三的倍数。

如果您希望使用制表符作为新列和其他列之间的分隔符,请确保其OFS值为\t

awk -v OFS='\t' '{ print (FNR-1) % 3 ? "H" : "O", $0 }' file

专门使用 GNUsed并假设您希望使用制表符将新列与其他列分隔开:

sed -e '1~3 s/^/O\t/' -e '1~3! s/^/H\t/' file

第一个表达式O从第 1 行开始,每隔三行添加一个制表符。第二个表达式向H从第 1 行开始不每隔三行的所有行添加一个制表符。

sed由于以下两个非标准功能,这需要 GNU :

  1. 地址的n~m意思是“每m:第行,从第 行开始n”。
  2. 字符序列\t被扩展为文字制表符。

使用其他工具:

yes 'O H H' | tr ' ' '\n' | head -n "$( wc -l <file )" | paste - file

这会使用和在单独的行上产生稳定的O, H, (重复)流。该流被缩短以匹配我们文件中的行数(这是使用 计算的)。然后使用将:s 和:s 插入到文件其余内容的左侧,并使用制表符作为分隔符。Hyestrheadwc -lOHpaste

答案3

可以这样做:

awk 'BEGIN {chars="OHH"; next_char=1} {print substr(chars, next_char, 1), $0; next_char++} next_char==4 {next_char=1}' matrix

相关内容