使用shell将值写入特定的行和列

时间:2018-05-25 12:19:45

标签: bash shell awk

我是shell脚本的新手,我手中的Task分为2个shell脚本。

我想做两个shell脚本的管道传输(它应该从不同的目录而不是编写脚本的地方运行)并且目前运行良好。

第一个shell脚本包含:

  1. 合并存储在文件夹中的大约90个.lvm文件。

  2. 裁剪每个.lvm文件,删除标题和裁剪直到数据结束。

  3. 现在我需要在每个文件被迭代后在第18列中打印一个值以区分文件结尾(这里我试着写500)

    #!/bin/sh
    clear
    for file in "$1/"*.lvm; do
        a=$(awk '/X_Value/{ print NR; exit }' "$file")
        b=$(awk 'END {print NR}' "$file")
        awk '{OFS= "\t"} {NR==$b $18,"500"}' "$file"
        #specified row is $b and column number is 18
        sed "s|\$a|${b}|" "$file"
    done
    

    第二个shell脚本包含:

    1. 从第一个shell脚本中读取特定列。
    2. 这是:

      #!/bin/sh
      clear
      while read line; do
         sleep 1
         awk -v OFS='\t' '{print $1, $2, $3, $8, $18}'
      done
      

      现在输出:

      file1  196287,265000    3,902977    -39,226354  0,873427  
      file1  196287,266000    3,890747    -51,032699  0,519405
      file1  196287,267000    3,900080    -51,472975  -0,446108
      ....
      ....
      ....
      file2 196287,268000 3,904586    -50,627182  -0,092086
      file2 196287,269000 3,870793    -30,687314  1,195265
      file2 196287,270000 3,897505    -30,073244  0,744692
      ....
      ....
      

      期望输出:

      file1  196287,265000    3,902977    -39,226354  0,873427     0
      file1  196287,266000    3,890747    -51,032699  0,519405     0
      file1  196287,267000    3,900080    -51,472975  -0,446108    500
      ...
      ...
      ...
      file2 196287,268000 3,904586    -50,627182  -0,092086  0
      file2 196287,269000 3,870793    -30,687314  1,195265   0
      file2 196287,270000 3,897505    -30,073244  0,744692   500
      ...
      ...
      

1 个答案:

答案 0 :(得分:0)

我不喜欢awk。我不使用awk。如果你必须嘲笑我。 如果bash无法处理某些东西,我会用perl重写它。 = O)

那就是说 - 这是一个笨拙的全剧版。 要做的很多改进,但是工作会让我的乐趣中断,哈哈

nl="
"
for f in "$1/"*.lvm
do typeset out=''
   while read a b c d e
   do out="$out$( printf "%-25s%14s%14s%14s%14s%14s" $f $a $b $c $d $e )$nl"
   done <<< "$(cut -f 1,2,3,8,18 -d '   ' $f )"
   stack="$stack$nl$(printf "${out% *} 500$nl")"
done
echo "$stack"|grep -v '^$'