使用Shell脚本操作文本文件

时间:2020-10-31 17:39:47

标签: linux shell for-loop awk

我将输入数据保存在文本文件(input.txt)中,如下所示

10    25 6 3    1   8   5   2   1   6  1
99    26 7 4    1   8   8   1   2   8  1

我只需要在第一列的第一行中每增加5后就将第四列值(3)的第一行增加一个,而我就不想打扰第二行 例如,如果我将上述数据作为输入,那么预期的输出将是

10    25 6 3    1   8   5   2   1   6  1
99    26 7 4    1   8   8   1   2   8  1

11    25 6 3    1   8   5   2   1   6  1
99    26 7 4    1   8   8   1   2   8  1

12    25 6 3    1   8   5   2   1   6  1
99    26 7 4    1   8   8   1   2   8  1

13    25 6 3    1   8   5   2   1   6  1
99    26 7 4    1   8   8   1   2   8  1

14    25 6 3    1   8   5   2   1   6  1
99    26 7 4    1   8   8   1   2   8  1

在那之后我想将第一行第4列的值增加一个,这样3当时的输出将是4,应如下所示

15    25 6 4    1   8   5   2   1   6  1
99    26 7 4    1   8   8   1   2   8  1

16    25 6 4    1   8   5   2   1   6  1
99    26 7 4    1   8   8   1   2   8  1

17    25 6 4    1   8   5   2   1   6  1
99    26 7 4    1   8   8   1   2   8  1

18    25 6 4    1   8   5   2   1   6  1
99    26 7 4    1   8   8   1   2   8  1

19    25 6 4    1   8   5   2   1   6  1
99    26 7 4    1   8   8   1   2   8  1

以此类推,下面给出了我的脚本,该脚本可以提供输出,但没有达到我的期望,我希望我可以从专家那里得到一些想法。

#!/bin/sh
for inc in $(seq 10 1 60)
do
  awk -vval=$inc '{
    if(NR==1) {
      $1=val
    } else $4=$4;
    print
  }' input.txt
echo '>>>>'
done

1 个答案:

答案 0 :(得分:1)

您的问题尚不清楚,此解决方案完全基于您显示的预期样本输出。解决方案具有2个awk变量times表示您要打印整个文件集的次数,而thr表示您要首先增加第4列的值的阈值是多少? Input_file的行。如果这不是您想要的,请编辑您的问题以提供更多详细信息。

awk -v times="10" -v thr="5" '
FNR==1{
  first=$1
  $1=""
  sub(/^ +/,"")
  firstRest1=$1 OFS $2
  thirdField=$3
  $1=$2=$3=""
  sub(/^ +/,"")
  firstRest2=$0
  next
}
{
  val=(val?val ORS:"")$0
}
END{
  ++count
  print first,firstRest1,thirdField,firstRest2 ORS val
  for(i=1;i<=times;i++){
    ++count
    print ++first,firstRest1,thirdField,firstRest2 ORS val
    if(count==(thr)){
      thirdField++
      count=""
    }
  }
}' Input_file | column -t


编辑: 由于OP要求针对整个内容写入(块)的每次迭代将输出输出到不同的输出文件中,因此添加此解决方案将创建输出文件例如output_file1output_file2等。

awk -v times="10" -v thr="5" '
FNR==1{
  first=$1
  $1=""
  sub(/^ +/,"")
  firstRest1=$1 OFS $2
  thirdField=$3
  $1=$2=$3=""
  sub(/^ +/,"")
  firstRest2=$0
  next
}
{
  val=(val?val ORS:"")$0
}
END{
  fileCnt=1
  output_file="output_file"fileCnt
  ++count
  print first,firstRest1,thirdField,firstRest2 ORS val > (output_file)
  for(i=1;i<=times;i++){
    ++count
    print ++first,firstRest1,thirdField,firstRest2 ORS val > (output_file)
    if(count==(thr)){
      thirdField++
      fileCnt++
      close(output_file)
      output_file="output_file"fileCnt
      count=""
    }
  }
}' Input_file | column -t