在awk中使用while循环打印列

时间:2015-02-04 00:06:04

标签: bash loops awk while-loop

我需要从文件中提取第二列的值,而$ 1 = 2 的值直到 $ 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

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

693000
718000 
725000

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

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

输出

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

我也试过这个

awk -F "|" '{i=2; do {print $2; i++} while ($4); if ($1>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或其他命令执行此操作?

谢谢

6 个答案:

答案 0 :(得分:2)

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($1>=3){c=0} if(c==1 ||($1>=2 && $1<3)){c = 1;print $2}}' sample.csv 
 693000
 718000 
 725000

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

答案 1 :(得分:2)

这就是我提出的:

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

1)/^2/,EOF {print $2}表示将第二列中的所有内容打印到文件结尾,从以 2

开头的行开头

2){if ($1==3) exit}在第一列数字为 3 后停止打印

<强>输出

693000
718000 
725000

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

在战术中使用awk中的getline语句

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

答案 4 :(得分:2)

这是另一个awk

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

-F\|将字段分隔符设置为| /^2/如果文件以2开头,则将标记f设置为true /^3/如果文件以2开头,则将标记f设置为false f {print $2+0}'如果标记f为真,请打印2 $2+0这用于删除数字前面的空格。如果它包含字母,请将其删除。

答案 5 :(得分:1)

因此,您不必阅读整个文件,当您看到“&#39;

后退出:

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