linux - awk 脚本在特定行打印信息

标签 linux command-line awk format line

我有一些数据文件,我需要提取一些信息。我想使用一个 awk 脚本来获取数据,这样我就可以将一些数据吸入 bash 数组中。

为此,我们假设我需要以下内容(1 索引): - 我需要 awk 打印第一列的第 2、3 和 4 行 - 我需要 awk 在第 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

提前致谢。

最佳答案

这应该有效 -

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

关于linux - awk 脚本在特定行打印信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8492805/

相关文章:

linux - 如何在 Linux 中获取两个单词之间的行数

shell - awk 命令在特定模式字符串之后提取字符串

如果模式后没有空格,则 sed 进行替换

command-line - 发明命令名称的好方法是什么?

linux - nvcc 从命令行而不是从 shell 运行

linux - 与 cat 相比,Bash while read 循环非常慢,为什么?

python - 捕获屏幕上所有内容的脚本

PYTHONPATH 作为 python 解释器的辅助

bash - Shell exec 和管道

python - 可以存储在内存中的函数