使用 bash 或类似方式将列插入到文件中
insert columns to file with bash or alike
假设我有一个像
这样的文件
1 3 44 5
2 23 1 44
我想在前两个之后添加两列 0,以获得
1 3 0 0 44 5
2 23 0 0 1 44
我可以使用类似
的东西
cat file|(
for ((i=0;i<nlines;i++))
do
read l
echo $(echo $l|cut -d" " -f -2) 0 0 $(echo $l|cut -d " " -f 3-)
done
) >output
其中 nlines
是已知的行数。但这恰好是极其缓慢的。
以快速方式完成工作的方法是什么?
Bash、awk 或其他 linux 命令行工具都可以。
使用awk
你可以做到:
awk '{ = "0 0 " } 1' file
1 3 0 0 44 5
2 23 0 0 1 44
或者这个 sed
也可以:
sed -i.bak -E 's/^(([^ ]+ +){2})/ 0 /' file
cat file
1 3 0 0 44 5
2 23 0 0 1 44
Perl 非常适合快速文本操作。在这里,你可以
perl -i.bak -lane 'splice @F, 2, 0, (0, 0); print join " ", @F' file
您可以使用 sed
来:
sed -E 's/^([^[:space:]]*[[:space:]]*[^[:space:]]*)(.*)$/ 0 0/' file
或ruby
:
ruby -lane 'puts ($F[0..1]+["0"]*2+$F[2..]).join(" ")' file
使用您显示的示例,请尝试以下 awk
代码。
awk '{= " 0 0 "} 1' Input_file
解释: 只需添加 space 和 2 个零(由 space 分隔)后跟 space进入第二个字段本身并打印当前行。
这可能适合您 (GNU sed):
sed -i 's/\S\+/& 0 0/2' file
单独替换第 2 列并追加 0 0
.
假设我有一个像
这样的文件1 3 44 5
2 23 1 44
我想在前两个之后添加两列 0,以获得
1 3 0 0 44 5
2 23 0 0 1 44
我可以使用类似
的东西cat file|(
for ((i=0;i<nlines;i++))
do
read l
echo $(echo $l|cut -d" " -f -2) 0 0 $(echo $l|cut -d " " -f 3-)
done
) >output
其中 nlines
是已知的行数。但这恰好是极其缓慢的。
以快速方式完成工作的方法是什么? Bash、awk 或其他 linux 命令行工具都可以。
使用awk
你可以做到:
awk '{ = "0 0 " } 1' file
1 3 0 0 44 5
2 23 0 0 1 44
或者这个 sed
也可以:
sed -i.bak -E 's/^(([^ ]+ +){2})/ 0 /' file
cat file
1 3 0 0 44 5
2 23 0 0 1 44
Perl 非常适合快速文本操作。在这里,你可以
perl -i.bak -lane 'splice @F, 2, 0, (0, 0); print join " ", @F' file
您可以使用 sed
来:
sed -E 's/^([^[:space:]]*[[:space:]]*[^[:space:]]*)(.*)$/ 0 0/' file
或ruby
:
ruby -lane 'puts ($F[0..1]+["0"]*2+$F[2..]).join(" ")' file
使用您显示的示例,请尝试以下 awk
代码。
awk '{= " 0 0 "} 1' Input_file
解释: 只需添加 space 和 2 个零(由 space 分隔)后跟 space进入第二个字段本身并打印当前行。
这可能适合您 (GNU sed):
sed -i 's/\S\+/& 0 0/2' file
单独替换第 2 列并追加 0 0
.