我需要从文件中提取第二列的值,而$ 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或其他命令执行此操作?
谢谢
答案 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