【问题标题】:What's wrong with my AWK when coping with the last column?处理最后一列时,我的 AWK 有什么问题?
【发布时间】:2016-04-14 06:28:00
【问题描述】:

我编写了一个 shell 脚本来从名为“POSCAR”的文件中提取数据。在win10系统下制作。它看起来像这样:

System
1.0
       23.0000000000         0.0000000000         0.0000000000
        0.0000000000        23.0000000000         0.0000000000
        0.0000000000         0.0000000000        17.0000000000
    C    H
   24    7
Direct

第 6 行和第 7 行是元素符号和原子数。我想得到一个字符串 = C24H7。所以我写了这样的脚本:

#!/bin/bash
path=$PWD
fin="POSCAR"
e_tot=`sed -n 6p $fin   |awk '{printf "%.1d", NF }'`
echo There are $e_tot columns.
ele=""
for ii in $(seq 1 1 $e_tot)
do
  echo $ii
  aa=`sed -n 6p $fin |awk -v ll=$ii '{printf "%s", $ll}'`
  mm=`sed -n 7p $fin |awk -v ll=$ii '{printf "%d", $ll}'`
  col=$aa$mm
  ele=$ele$col
done

输出用于最后一列。我可以得到 C24H,但“7”丢失了。或者它只是被导出到下一行。 我想可能与该行的最后一个字符有关,它是windows产生的,Linux不识别,不知道是什么。 awk 的 BEGIN{FS="[ \n\t]+"} 不起作用。 哪里错了? 谢谢...

【问题讨论】:

  • 结合了 shell、Awk 和 sed 的复杂脚本通常可以通过在单个 Awk 脚本中完成而大大简化。
  • 你说得对~@tripleee

标签: linux awk


【解决方案1】:

使用 awk:

awk 'NR==6{a=$1;b=$2}NR==7{print a $1 b $2}' file
C24H7

【讨论】:

  • 感谢您的简化...但我认为问题出在我的输入文件“POSCAR”中。因为我的代码和你的代码都适用于基于 Fortran 的软件之后的输出文件“CONTCAR”。
  • @smirkymonkey:你的文件使用dos行尾吗?先运行dos2unix yourfile再试一次
  • 谢谢!!! tr -d '\015' < POSCAR > POSCAR1 echo awk 'NR==6{a=$1;b=$2}NR==7{print a $1 b $2}' POSCAR1 ``终于可以了。非常感谢!我学到了很多!
  • @smirkymonkey:嗯,这也可以简化:tr -d '\015' < POSCAR | awk 'NR==6{a=$1;b=$2}NR==7{print a $1 b $2}' :)
  • 是的,是的,谢谢!我终于赢得了 15 个声望来支持这个答案:))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 2021-05-13
相关资源
最近更新 更多