Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何按照模式拆分列值_Bash_Awk_Sed - Fatal编程技术网

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