操作txt文件

操作txt文件

我需要在同一目录下操作很多txt文件。每个文件都有相同的格式名称(Pocket_????????.pdb_OUTPUT.txt) 和相同的内部结构。

这是一个示例(文件名:Pocket_001_1b47_A.pdb_OUTPUT.txt)

Input PDB-File:         /home/tommaso/Desktop/E3-ligase/CHAINS-approach/chains/1b47_A/1b47_biounit1_1b47_A.pdb
Pocket File:            /home/tommaso/Desktop/E3-ligase/CHAINS-approach/chains/1b47_A/Pocket_001_1b47_A.pdb
Pocket Surface:         649.1  
Hydrophobic Surface:    0.0     ( 0.0%)
Polar Surface:          441.0   (67.9%)
Acceptor Surface:       309.9   (47.7%)
Donnor Surface:         399.9   (61.6%)
Exposed To Solvent:     186.8   (28.8%)
Pocket Volume:          1255.9 
Hydrophobic Volume:     0.0     ( 0.0%)
Hydrophilic Volume:     229.1   (18.2%)
Flexible Volume:        134.2   (10.7%)
Rigid Volume:           120.2   ( 9.6%)
Buried Volume(B):       48.5    ( 3.9%)
Buried Volume(A):       0.0     ( 0.0%)

我需要获得输出(Pocket_????????.pdb_OUTPUT_2.txt),其中报告原始文件的名称和每行中存在的值,按照它们在原始文件中报告的顺序排列,并用逗号分隔。

es.输出(Pocket_001_1b47_A.pdb_OUTPUT_2.txt):

Pocket_001_1b47_A.pdb_OUTPUT.txt,649.1,0.0,(0.0%),441.0,(67.9%),309.9,(47.7%),399.9,(61.6%),186.8,(28.8%),1255.9,0.0,( 0.0%),229.1,(18.2%),134.2,(10.7%),120.2,( 9.6%),120.2,( 9.6%),0.0,( 0.0%)

我认为有必要一个循环来处理每个文件并获取每个文件的相对输出文件。

有人可以帮我吗?谢谢你!!!

答案1

尝试,

for f in Pocket_??????????.pdb_OUTPUT.txt; do
    output=$(
        awk -F: 'NR>2{gsub("[[:blank:]]","",$2);print $2;}' "$f" \
        | sed 's/(/\n(/' \
        | paste -sd,
    )
    printf '%s,%s\n' "$f" "$output" >  "${f%.*}_2.txt"
done

解释:

  • 使用循环文件for f in ...; do ... done

在循环内,链...

  • awk -F: 'NR>2{gsub("[[:blank:]]", "", $2); print $2;}'删除前两行并删除所有空格和制表符$2
  • sed添加新行(
  • paste -sd,将之前的内容制作成 csv

然后

  • "$f"使用以下命令将其与文件名放在一起printf
  • 写入"${f%.*}_2.txt"(删除.txt并添加_2.txt

答案2

您可以在不实现任何循环的情况下完成此操作,只需将带有通配符的文件传递给awk命令即可:

awk -F':' '{$1 =""; sub(/^[ \t]+/, "");
           sub(/[ \t]+$/, "");
           sub(/[ \t]+/,",");
           printf("%s%s",FNR==1?"":",",$1) >> substr(FILENAME, 0, length(FILENAME)-4)"_2.txt"}' Pocket_*.pdb_OUTPUT.txt

解释

  • 首先删除冒号之前的元素 ( $1 =""),以及剩余项目之前 ( sub(/^[ \t]+/, "")) 和之后 ( ) 的空格。sub(/[ \t]+$/, "")
  • 元素之间的空格用逗号 ( sub(/[ \t]+/,","))代替
  • 最后,我们使用修改后的输入将元素输出到正确的文件,FILENAME如果元素不是特定文件的第一行,则在元素之间添加逗号。

相关内容