awk脚本在特定行打印信息

时间:2011-12-13 16:41:43

标签: linux command-line awk format line

我有一些数据文件,我需要提取一些信息。我想使用一个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
提前谢谢。

4 个答案:

答案 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