我有一些数据文件,我需要提取一些信息。我想使用一个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打印字符串:
def ghi jkl 11 55 99 14 22 66 00 15 33 77 12 16
我创建了以下内容,我认为这样可行,但我收到错误消息“END bocks必须有一个动作部分”。
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
提前谢谢。
答案 0 :(得分:2)
这应该有效 -
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
答案 1 :(得分:2)
略显冗长。但是这很好,如果你想保留它,它可以维护。
每个awk规则是:
<Match> <Action>
要么可能是空的:
清空&lt;匹配&gt;意味着匹配每一行。
空&lt;行动&gt;表示打印(打印当前行)。
当然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];
}
您遇到的另一个问题是print会在其打印的字符串上添加换行符
绕过这个用途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]);
}
答案 2 :(得分:1)
下面的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
答案 3 :(得分:0)
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