Linux 什么';在处理最后一篇专栏文章时,我的AWK出了什么问题?

Linux 什么';在处理最后一篇专栏文章时,我的AWK出了什么问题?,linux,awk,Linux,Awk,我编写了一个shell脚本来从名为“POSCAR”的文件中提取数据。它是在win10系统中生成的。看起来是这样的: System 1.0 23.0000000000 0.0000000000 0.0000000000 0.0000000000 23.0000000000 0.0000000000 0.0000000000 0.0000000000 17.000

我编写了一个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
#!/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
第6行和第7行是元素符号和原子数。我想得到一个字符串=C24H7。所以我写的剧本是这样的:

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
#!/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]+”}不起作用。 哪里错了? 感谢您……

与awk合作:

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

将shell、Awk和
sed
组合在一起的复杂脚本通常可以通过在单个Awk脚本中完成这一切而大大简化。您的简化是正确的~@tripleEthanks。。。但我认为问题出在我的输入文件“POSCAR”中。因为我的代码和你的代码在基于Fortran的软件之后都能很好地用于输出文件“CONTCAR”。@smirkymonkey:你的文件是否使用dos行尾?首先运行
dos2unix您的文件
,然后再试一次谢谢
tr-d'\015'POSCAR1 echo
awk'NR==6{a=$1;b=$2}NR==7{print a$1b$2}'POSCAR1``终于成功了。非常感谢你!我学到了很多@smirkymonkey:嗯,这也可以简化:
tr-d'\015'
:)是的,谢谢!最后,我赢得了15个声誉,对这个答案进行了投票:))