使用while循环在bash中选择列范围
我有一个名为使用while循环在bash中选择列范围,bash,awk,Bash,Awk,我有一个名为text的文本文件:行和列为: 1 A 18 -180 2 B 19 -180 3 C 20 -150 50 D 21 -100 128 E 22 -130 140 F 23 -0 如果我们想使用while循环逐行迭代,它将是: while read -ra a; do [[ ${a[3]} != -0 ]] && ((a[3]+=42)); echo "${a[@]}"; done < file 上一行的
text
的文本文件:行和列为:
1 A 18 -180
2 B 19 -180
3 C 20 -150
50 D 21 -100
128 E 22 -130
140 F 23 -0
如果我们想使用while循环逐行迭代,它将是:
while read -ra a; do [[ ${a[3]} != -0 ]] && ((a[3]+=42)); echo "${a[@]}"; done < file
上一行的内容是在第4列的每一行中添加42
,除非0。
如何使用第一列选择多个列范围?例如,我只想从第一列中选择2到50,这意味着我只想打印2、3和4列。因此,输出将是
2 B 19 -138
3 C 20 -108
50 D 21 -58
第一种解决方案:如果您只想打印满足条件的行,并且只对这些行执行操作,请尝试以下操作
awk '$1>=2 && $1<=50{$4+=42;print}' Input_file
while read first second third fourth
do
if [[ "$first" -ge 2 && "$first" -le 50 ]]
then
echo "$first $second $third $((fourth+42))"
fi
done < "Input_file"
上述代码的输出如下所示:
2 B 19 -138
3 C 20 -108
50 D 21 -58
第一种解决方案:如果您只想打印满足条件的行,并且只对这些行执行操作,请尝试以下操作
awk '$1>=2 && $1<=50{$4+=42;print}' Input_file
while read first second third fourth
do
if [[ "$first" -ge 2 && "$first" -le 50 ]]
then
echo "$first $second $third $((fourth+42))"
fi
done < "Input_file"
上述代码的输出如下所示:
2 B 19 -138
3 C 20 -108
50 D 21 -58
Sed变体
sed -n "/^2 /,/^50 /p" file
此sed命令表示打印(p)图案“^2”和“^50”之间的所有行
包括具有图案匹配的线条,符号“^”表示线条的开头
或者您可以将大括号扩展与sed一起使用
for i in {2..50}; { sed -n "/^$i /p" file; }
或使用grep
for i in {2..50}; { grep "^$i " file; }
它非常慢,但理解、记忆和使用起来非常简单。Sed variant
sed -n "/^2 /,/^50 /p" file
此sed命令表示打印(p)图案“^2”和“^50”之间的所有行
包括具有图案匹配的线条,符号“^”表示线条的开头
或者您可以将大括号扩展与sed一起使用
for i in {2..50}; { sed -n "/^$i /p" file; }
或使用grep
for i in {2..50}; { grep "^$i " file; }
它的速度很慢,但理解、记忆和使用起来很简单。到目前为止,它看起来不错,但我假设OP希望将数字添加到第四列,除非第四列的值为零。@tshiono,谢谢你的意见,伙计。但是OP的示例输出没有行128e22-88
和OP,比如,我只想从第一列中选择2到50,所以我想到了这一点。我的英语不是很好:)可能是我没听懂吧?:)OP只能确认这一点。感谢您的及时回复。我同意你的看法。让我们等待OP的反馈。BR.到目前为止看起来不错,但我假设OP希望将数字添加到第四列,除非第四列的值为零。@tshiono,谢谢你的意见,伙计。但是OP的示例输出没有行128e22-88
和OP,比如,我只想从第一列中选择2到50,所以我想到了这一点。我的英语不是很好:)可能是我没听懂吧?:)OP只能确认这一点。感谢您的及时回复。我同意你的看法。让我们等待OP的反馈。比尔。