我有一些数据文件,我需要拉出一些信息。 我想用一个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