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