我想提取“ file1”中这两行之间的第一列(%BLOCK position_frac和%ENDBLOCK position_frac)。
%BLOCK positions_frac
Si 0.5303000000000000 0.0000000000000000 0.3333000000000000
Si 0.0000000000000000 0.5303000000000000 0.6666299999999999
Si 0.4697000000000000 0.4697000000000000 0.9999700000000000
O 0.1462000000000000 0.4142000000000000 0.8810000000000000
O 0.7320000000000000 0.5858000000000000 0.7856700000000000
O 0.5858000000000000 0.7320000000000000 0.2143300000000000
O 0.2680000000000000 0.8538000000000000 0.5476700000000000
O 0.4142000000000000 0.1462000000000000 0.1190000000000000
O 0.8538000000000000 0.2680000000000000 0.4523300000000000
%ENDBLOCK positions_frac
我可以使用:
awk '/%BLOCK\ positions_frac/{flag=1;next}/%ENDBLOCK\ positions_frac/{flag=0}flag' file1
然后我想将第一列存储在数组中,但是存储非等效列
预期输出:
array= ["Si", "O"]
答案 0 :(得分:3)
这是编写awk部分的方法(如果愿意,可以将其全部压缩回1行):
$ awk '
/%ENDBLOCK positions_frac/ { inBlock=0 }
inBlock && !seen[$1]++ { print $1 }
/%BLOCK positions_frac/ { inBlock=1 }
' file
Si
O
那么就是将输出保存到shell数组中了:
arr=( $(awk '...' ) )
答案 1 :(得分:0)
所以这解决了它:
arr=($( awk '/%BLOCK\ positions_frac/{flag=1;next}/%ENDBLOCK\ positions_frac/{flag=0}flag {print $1}' file1 |sort -u))
感谢您的建议。我意识到我只需要使用管道即可。