我需要在同一目录下操作很多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
如果元素不是特定文件的第一行,则在元素之间添加逗号。