初来乍到这个网站:我在分析 CSV 文件的数据时遇到了问题。
我写了一个小脚本,从 CSV 文件中读取输入并仅打印所需的字段:
awk -F,-v _sourcefile=$i -v title="\"${k}\"" -v box="_${j}_" -v score="$dock_score_column" -v hbond="${xp_terms_columns[0]}" -v electro="${xp_terms_columns[1]}" -v phoben="${xp_terms_columns[2]}" -v phobenhb="${xp_terms_columns[3]}" -v lowmw="${xp_terms_columns[4]}" -v rotpenal="${xp_terms_columns[5]}" -v lipophilicevdw="${xp_terms_columns[6]}" -v phobenpairhb="${xp_terms_columns[7]}" -v sitemap="${xp_terms_columns[8]}" -v penalties="${xp_terms_columns[9]}" -v pistack="${xp_terms_columns[10]}" -v hbpenal="${xp_terms_columns[11]}" -v expospenal="${xp_terms_columns[12]}" -v picat="${xp_terms_columns[13]}" -v clbr="${xp_terms_columns[14]}" -v zpotr="${xp_terms_columns[15]}"
'BEGIN {format ="%-8s %s %9s %9s %8s %10s %7s %10s %16s %14s %9s %11s %9s %9s %12s %7s %6s %7s\n"} $title_column〜title&&$ source_column〜_sourcefile&&$ source_column〜box
{printf format,$score,"= ",$hbond,$electro,$phoben,$phobenhb,$lowmw,$rotpenal,$lipophilicevdw,$phobenpairhb,$sitemap,$penalties,$pistack,$hbpena l,$expospenal,$picat,$clbr,$zpotr}' $file
这东西一团糟,但暂时它能够满足我的需求。
问题是:如何通过将存储在{xp
terms
columns[@]}
中的字段传递给它来简化它呢?
该文件是一个普通的csv文件,awk脚本的第一部分只是查找要打印的正确记录,我唯一的问题是需要声明16个不同的变量来进行打印。
我尝试在awk中使用数组,像这样:
awk -F, -v _sourcefile=$i -v title="\"${k}\"" -v box="_${j}_" -v terms="$xp_terms_columns" 'BEGIN{split(terms, array, " ")} $title_column ~ title && $source_column ~ _sourcefile && $sour ce_column ~ box { n=asorti(array, sorted); for (i=1;i<=n;i++) printf " " $sorted[i] }' $file
但没有成功,因为我无法使asorti按正确的顺序打印字段。
这是第一个脚本,已经清晰地编写出来以帮助解决这个问题,并为OP提供一个示例以便日后跟随。
awk -F, \
-v _sourcefile="$i" \
-v title="\"${k}\"" \
-v box="_${j}_" \
-v score="$dock_score_column" \
-v hbond="${xp_terms_columns[0]}" \
-v electro="${xp_terms_columns[1]}" \
-v phoben="${xp_terms_columns[2]}" \
-v phobenhb="${xp_terms_columns[3]}" \
-v lowmw="${xp_terms_columns[4]}" \
-v rotpenal="${xp_terms_columns[5]}" \
-v lipophilicevdw="${xp_terms_columns[6]}" \
-v phobenpairhb="${xp_terms_columns[7]}" \
-v sitemap="${xp_terms_columns[8]}" \
-v penalties="${xp_terms_columns[9]}" \
-v pistack="${xp_terms_columns[10]}" \
-v hbpenal="${xp_terms_columns[11]}" \
-v expospenal="${xp_terms_columns[12]}" \
-v picat="${xp_terms_columns[13]}" \
-v clbr="${xp_terms_columns[14]}" \
-v zpotr="${xp_terms_columns[15]}" \
'
BEGIN {
format = "%-8s %s %9s %9s %8s %10s %7s %10s %16s %14s %9s %11s %9s %9s %12s %7s %6s %7s\n"
}
($title_column ~ title) && ($source_column ~ _sourcefile) && ($source_column ~ box) {
printf format, $score, "= ", $hbond, $electro, $phoben, $phobenhb, $lowmw, \
$rotpenal, $lipophilicevdw, $phobenpairhb, $sitemap, $penalties, \
$pistack, $hbpenal, $expospenal, $picat, $clbr, $zpotr
}
' "$file"
awk
可以轻松地读取 2(或更多)个文件,因此您可以将所有参数和字段更简单地放在第二个(参数)文件中。https://stackoverflow.com/a/21875931/2836621 - Mark Setchell[awk] FNR
即可。这里有一个不错的例子https://stackoverflow.com/a/42851648/2836621 - Mark Setchell$title_column
和$source_column
两列,但我没有看到title_column
和source_column
的任何定义/赋值;这只是一个笔误吗(例如,在此代码副本中错误地省略了-v title_column=...
和-v source_column=...
)? - markp-fuso