Bash 如何按照模式拆分列值
我试图通过在链标识符后添加空格来拆分Bash 如何按照模式拆分列值,bash,awk,sed,Bash,Awk,Sed,我试图通过在链标识符后添加空格来拆分.pdb文件的第五列: ATOM 12107 N CYS D1742 -42.369 73.203 -44.599 1.00224.20 C N 因此,输出将如下所示: ATOM 12107 N CYS D 1742 -42.369 73.203 -44.599 1.00224.20 C N 字母后的数字在整个文件中更改。我试过了 sed -i 's/D/D /5' tes
.pdb
文件的第五列:
ATOM 12107 N CYS D1742 -42.369 73.203 -44.599 1.00224.20 C N
因此,输出将如下所示:
ATOM 12107 N CYS D 1742 -42.369 73.203 -44.599 1.00224.20 C N
字母后的数字在整个文件中更改。我试过了
sed -i 's/D/D /5' test.pdb
如果没有成功,我想我应该引入广义字符来替换字母后面的数字,并在命令中引入它,以便能够迭代地执行此操作。下面的
awk
可能会对您有所帮助
awk '{$5=substr($5,1,1) FS substr($5,2)} 1' OFS="\t" Input_file
如果您需要将输出保存到同一个输入文件中,那么您也可以在上述代码中附加
>临时文件和&mv临时文件输入文件。
使用sed
您需要自己计算字段,但不会将空格作为副作用进行规范化
$ sed -E 's/((\S+\s+){4}.)/\1 /' file
ATOM 12107 N CYS D 1742 -42.369 73.203 -44.599 1.00224.20 C N
使用GNU awk。由于您没有指定字段分隔符是什么,而且它似乎是一串空格(是的,很可能是制表符),因此我使用
split
将分隔符保留到数组seps
中,并使用sub
将空格添加到第五个字段中:
$ awk ' {
n=split($0,a,FS,seps) # split record to a, preserve separators to seps, keep n
sub(/D/,"& ",a[5]) # replace first D with D space (not an add :)
for(i=1;i<=n;i++) # iterate all a
b=b a[i] seps[i] # gather to buffer b
print b; b="" # output and clear b
}' file
ATOM 12107 N CYS D 1742 -42.369 73.203 -44.599 1.00224.20 C N
$awk'{
n=拆分($0,a,FS,seps)#将记录拆分为a,将分隔符保存到seps,保留n
sub(/D/,“&”,a[5])#将第一个D替换为D空格(不是add:)
对于(i=1;i这可能适用于您(GNU-sed):
一列必须由一个或多个非空格字符组成,这将在第五列的第一个和零个或多个字符之间放置一个空格。I可以工作,但我需要保持格式设置,即在第5、9和10列之后设置制表符,否则pymol将无法读取it@AlessandraZarantonello,不清楚,请在你的问题中说得更清楚些?@Ravinder,我想k您需要设置OFS=“\t”
并在调整$5I时使用空格而不是OFS,就像您在此任务中使用字符串函数一样。也可以使用正则表达式搜索和替换,但它不会增加清晰度:awk-v OFS=“\t”{sub(/^,“&”,$5)}1'
您想要“
不是substr函数之间的OFS
。由于整个LHS在RHS中使用,另一个解决方案是sed的/\s\+\s\+\{4\}。/&/'文件
sed -r 's/(\S)(\S*)/\1 \2/5' file