【问题标题】:Print column using while loop in awk在 awk 中使用 while 循环打印列
【发布时间】:2015-04-03 08:57:42
【问题描述】:

我需要从文件中提取第二列的值,而 $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 或其他命令来做到这一点?

谢谢

【问题讨论】:

  • 第一个问题非常好,样本数据少,需要输出,而且......喘不过气来一些接近工作的代码!继续发帖,祝你好运。
  • @shellter 完全同意...
  • Col 1 总是排序的?
  • 感谢您提供这么多优雅的答案!所有这些似乎都像一个魅力!

标签: bash loops awk while-loop


【解决方案1】:
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 打印出来。

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        在 awk 中策略性地使用 getline 语句

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

        【讨论】:

          【解决方案5】:

          这是另一个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}' 如果标志@ 987654332@ 为真,打印归档2
          $2+0 这用于删除数字前面的空格。如果它包含字母,请将其删除。

          【讨论】:

          • 如果它包含 20,21 等呢?
          • 这会更笼统awk -F"[| ]+" '$1~/^(2|3)$/{x=!x}x{print $2}'
          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 2023-03-12
            • 1970-01-01
            • 2021-08-26
            • 2019-11-22
            • 2020-04-21
            • 2014-08-12
            • 1970-01-01
            • 1970-01-01
            • 2014-11-28
            相关资源
            最近更新 更多