awk脚本在特定行打印信息

我有一些数据文件,我需要拉出一些信息。 我想用一个awk脚本来获取数据,所以我可以将一些数据吸收到bash数组中。

为此,我们假设我需要以下内容(1索引): – 我需要awk打印第2,3和4行上的第一列 – 我需要awk打印第8行和第8行上的列1,2和3。 但是我希望所有在列之前打印的列和三列之前的列都是两列。

使用以下数据示例:

abc def ghi jkl mno 1a1 2b2 11 22 33 44 55 66 77 88 99 00 12 13 14 15 16 17 

我想awk打印string:

 def ghi jkl 11 55 99 14 22 66 00 15 33 77 12 16 

我创造了以下,我认为会工作,但我得到一个错误,说:“结束博克必须有一个行动的一部分”。

 awk ' BEGIN {i=0;} { if ((NR >= 2) && (NR <= 4)) print $1; if (NR >= 8) { col1_arr[i] = $1; col2_arr[i] = $2; col3_arr[i] = $3; i++; } } END { for (j = 0; j < i; j++) print col1_arr[j]; for (j = 0; j < i; j++) print col2_arr[j]; for (j = 0; j < i; j++) print col3_arr[j]; }' /path/to/my/file 

提前感谢。

这应该工作 –

 awk ' BEGIN{i=0;} NR>=2 && NR<=4 {printf $1" "} NR >=8 {col1[i]=$1;col2[i]=$2;col3[i]=$3;i++;} END{for (i=0;i<=NR-8;i++) printf col1[i]" "; for(i=0;i<=NR-8;i++) printf col2[i]" ";for (i=0;i<=NR-8;i++) printf col3[i]" "}' INPUT_FILE [jaypal:~/Temp] cat data abc def ghi jkl mno 1a1 2b2 11 22 33 44 55 66 77 88 99 00 12 13 14 15 16 17 [jaypal:~/Temp] awk ' BEGIN{i=0;} NR>=2 && NR<=4 {printf $1" "} NR >=8 {col1[i]=$1;col2[i]=$2;col3[i]=$3;i++;} END{for (i=0;i<=NR-8;i++) printf col1[i]" "; for(i=0;i<=NR-8;i++) printf col2[i]" ";for (i=0;i<=NR-8;i++) printf col3[i]" "}' data def ghi jkl 11 55 99 14 22 66 00 15 33 77 12 16 

略显冗长。 但是,如果你想保持它,那么它就可以维护。

每个awk规则是:

 <Match> <Action> 

要么可能是空的:

空<Match>表示匹配每一行。
空<Action>表示打印(打印当前行)。

当然END没有行,所以打印变得毫无意义。

你有什么是:

 END -- No Action -- --No Match -- { print your col arrays } 

你需要做的是把行动放在同一条线上。

 END { for (j = 0; j < i; j++) print col1_arr[j]; for (j = 0; j < i; j++) print col2_arr[j]; for (j = 0; j < i; j++) print col3_arr[j]; } 

你遇到的另一个问题是打印把一个换行符放到它打印的字符串上。
解决这个问题printf("<format string>", variables);

 BEGIN {i=0;} { if ((NR >= 2) && (NR <= 4)) printf("%s ", $1); if (NR >= 8) { col1_arr[i] = $1; col2_arr[i] = $2; col3_arr[i] = $3; i++; } } END { for (j = 0; j < i; j++) printf("%d ", col1_arr[j]); for (j = 0; j < i; j++) printf("%d ", col2_arr[j]); for (j = 0; j < i; j++) printf("%d ", col3_arr[j]); } 

下面的awk行应该为你做这个工作:

 awk '(NR==1 || NR>=5 && NR<=7){next;} {printf $1" ";if(NR>=8){two[NR]=$2;three[NR]=$3}} END{for(x in two)printf two[x]" ";for(x in three) printf three[x]" "}' yourFile 

用你的例子测试一下:

 kent$ echo "abc def ghi jkl mno 1a1 2b2 11 22 33 44 55 66 77 88 99 00 12 13 14 15 16 17 "| awk '(NR==1 || NR>=5 && NR<=7){next;} {printf $1" ";if(NR>=8){two[NR]=$2;three[NR]=$3}} END{for(x in two)printf two[x]" ";for(x in three) printf three[x]" "}' 

产量

 def ghi jkl 11 55 99 14 22 66 00 15 33 77 12 16 
 awk 'END { printf "%s", (r OFS) for (i = 0; ++i <= l;) printf "%s", (m[i] (i < l ? OFS : RS)) } NR > 1 && NR < 5 { r = r ? r OFS $0 : $0 } NR >= 8 { for (i = 0; ++i <= l;) m[i] = i in m ? m[i] OFS $i : $i }' l=3 infile