使用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的反馈。比尔。