在 awk 中使用 while 循环打印列

Print column using while loop in awk

我需要从文件中提取第二列的值,而 $1 = 2 until $1 = 3 的值。例如,从文件

1 | 2.158e+06
  | 2.31e+06 
  | 5.008e+06 
2 | 693000
  | 718000 
  | 725000
3 | 2.739e+06 
  | 2.852e+06 
  | 2.865e+06
  | 2.874e+06
4 | 4.033e+06
  | 4.052e+06
  | 4.059e+06

我想提取第 2 列的值,从 $1=2 到 $1=3

693000
718000 
725000

我尝试使用 awk,但我刚刚想出了如何从 $1=1 提取值直到 $2=2

  awk -F "|" '{if (>1) exit; else print }' foo.txt

输出

2.158e+06
2.31e+06 
5.008e+06 

我也试过这个

awk -F "|" '{i=2; do {print ; i++} while (); if (>i) exit}' foo.txt

但它给了我整个第二列

2.158e+06
2.31e+06 
5.008e+06 
693000
718000 
725000
2.739e+06 
2.852e+06 
2.865e+06
2.874e+06
4.033e+06

有谁知道如何使用 awk 或其他命令执行此操作?

谢谢

hzhang@dell-work ~ $ cat sample.csv 
1 | 2.158e+06
  | 2.31e+06 
  | 5.008e+06 
2 | 693000
  | 718000 
  | 725000
3 | 2.739e+06 
  | 2.852e+06 
  | 2.865e+06
  | 2.874e+06
4 | 4.033e+06
  | 4.052e+06
  | 4.059e+06
hzhang@dell-work ~ $ awk -F"|" 'BEGIN{c=0}{if(>=3){c=0} if(c==1 ||(>=2 && <3)){c = 1;print }}' sample.csv 
 693000
 718000 
 725000

我设置了一个标志c。如果 $1 不在 2 和 3 之间,则标志设置为 0,否则为 1,这意味着我们可以打印出 $2。

这是我想出的:

awk -F "|" '{if (==3) exit} /^2/,EOF {print }' file

1) /^2/,EOF {print } 表示打印第二列中的所有内容,直到文件 末尾 ,从以 2[ 开头的行开始=27=]

2) {if (==3) exit} 一旦第一列是数字就停止打印 3

输出

693000
718000 
725000

范围模式在这里可以很好地工作。模式 ==2,==3 将在第一列为 2 时开始执行操作,并在第一列为 3 时停止。(由于范围是包容性的,在这种情况下,我们需要在打印第二列之前检查第一列是否不是 3 .)

$ awk -F\| '==2,==3 { if ( != 3) print  }' foo.txt
693000
718000 
725000

巧妙地在 awk 中使用 getline 语句

awk -v FS=" [|] "  '=="2"{print ;getline;while((==" "||==2)){print ;[=10=]="";getline>0}}' my_file

这是另一个awk

awk -F\| '/^2$/ {f=1} /^3$/ {f=0} f {print +0}' file
693000
718000
725000

-F\| 将字段分隔符设置为 | /^2/ 如果文件以 2 开头,设置标志 f 为真。
/^3/ 如果文件以 2 开头,将标志 f 设置为 false。
f {print +0}' 如果标志 f 为真,打印字段 2.
+0这个用来去掉数字前面的space。如果它包含字母,请将其删除。

这样您就不必阅读整个文件,当您看到“3”时退出:

$ awk -F\| '/^2\s+/ {f=1} /^3\s+/ {exit} f {print +0}' file
693000
718000
725000