我想使用 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 :
- 地址的
n~m
意思是“每m
:第行,从第 行开始n
”。 - 字符序列
\t
被扩展为文字制表符。
使用其他工具:
yes 'O H H' | tr ' ' '\n' | head -n "$( wc -l <file )" | paste - file
这会使用和在单独的行上产生稳定的O
, H
, (重复)流。该流被缩短以匹配我们文件中的行数(这是使用 计算的)。然后使用将:s 和:s 插入到文件其余内容的左侧,并使用制表符作为分隔符。H
yes
tr
head
wc -l
O
H
paste
答案3
可以这样做:
awk 'BEGIN {chars="OHH"; next_char=1} {print substr(chars, next_char, 1), $0; next_char++} next_char==4 {next_char=1}' matrix