我将输入数据保存在文本文件(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
答案 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_file1
,output_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