【问题标题】:Make all entries in an ascii file in one column in awk在 awk 的一列中创建 ascii 文件中的所有条目
【发布时间】:2014-02-25 06:51:14
【问题描述】:

我有以下文件

CHO 1
4096
26 20 0 0 0 0 0 0 0 0 
0 0 0 0 0 3 5 15 8 14 
9 7 13 10 12 9 5 3 3 2 
2 0 0 0 0 0 0 1 1 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 1 0 1 0 0 0 
0 0 0 0 0 0 1 0 0 0 
0 0 0 0 1 0 0 0 0 0
6 8 5 5 7 13 13 33 23 29 
44 51 56 42 39 31 21 24 18 18 
18 30 44 43 51 67 102 110 130 130 
100 96 87 49 25 16 4 1 1 0
0 0 0 0 0 0

我想要做的是将4096 之后的所有条目放在一列中。所需的输出如下

1 26
2 20
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
...
4096 0

我不知道如何使用 awk。例如,我尝试使用

将它们放在一行中

awk -F'\n' '{if(NR == 1) {printf $0} else {printf $0}}' file

但我不知道如何将它们放到一列。更不用说第一个条目不如预期的事实了。

CHO 1409626 20 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5

知道如何获得所需的两列输出吗?任何帮助都非常受欢迎!!!

【问题讨论】:

  • 您可以将它们全部放在同一行并循环遍历字符串。
  • @fedorqui:感谢您的回答。我已经尝试将它们放在一行中,但我不知道如何使这一行成为一列。
  • 您希望第二行指示的条目数在不存在数据的情况下配对为零吗?还是只是对存在的数据进行排序?
  • @potong :我希望在第 2 行之后(即从第 3 行开始)将所有数据放在一列中,同时有一个新列将“计算”从 1 开始的条目数。

标签: sed awk grep gawk


【解决方案1】:

使用 Perl 可以通过重新调整来完成:

#!/usr/bin/perl

use strict;
use warnings;

my @lines = ('CHO 1', '4096', #simulate line-by-line loading of the file
'26 20 0 0 0 0 0 0 0 0',
'0 0 0 0 0 3 5 15 8 14', 
'9 7 13 10 12 9 5 3 3 2', 
'2 0 0 0 0 0 0 1 1 0', 
'0 0 0 0 0 0 0 0 0 0', 
'0 0 0 0 1 0 1 0 0 0', 
'0 0 0 0 0 0 1 0 0 0', 
'0 0 0 0 1 0 0 0 0 0',
'6 8 5 5 7 13 13 33 23 29', 
'44 51 56 42 39 31 21 24 18 18', 
'18 30 44 43 51 67 102 110 130 130', 
'100 96 87 49 25 16 4 1 1 0',
'0 0 0 0 0 0');


my $first_line = shift @lines; #removes CHO 1
my $stop = shift @lines; #removes 4096 
my $i = 0;


foreach my $line (@lines) {
  $line =~ s/^\s*//;
  $line =~ s/\s*$//;

  my @parts = split(/\s+/, $line);
  foreach my $part (@parts) {
    print "$i $part\n"; #prints to stdout, maybe you want to print into a file
    $i++;
  }

}

这是输出:

0 26
1 20
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 3
16 5
 ...
125 0
 ...

【讨论】:

    【解决方案2】:

    这样就可以了:

    $ awk 'NR>2{$1=$1;print}' OFS='\n' file 
    

    【讨论】:

    • 非常感谢您的回答!如何添加从 1 到 4096 的列?
    • 没想到你真的想要行数,你可以用nl 那个awk 'NR>2{$1=$1;print}' RS=' ' file | nl -n ln
    • +1 不知道为什么会有人不赞成这种厚颜无耻的单线。我会在任何一天使用它而不是顶部的答案。
    【解决方案3】:

    OP 请求 put all entries after 4096 in one column。其他解决方案只是假设其记录号2。这个gnu awk 应该解决这个问题,以及行尾空格的问题:

    awk 'f{print ++x,$1} /4096/{f=1}' RS=" | *\n" file
    

    PS 你需要gnu awk,因为RS 中有多个字符

    【讨论】:

      【解决方案4】:

      这可以通过 GNU awk 来完成,它可以使用正则表达式作为第二分隔符 (RS):

      gawk -v RS="[[:space:]]+" 'NR > 3 { print NR-3, $0 }' file
      

      【讨论】:

        【解决方案5】:

        这可能对你有用(GNU sed):

        sed -r '1d;2{s/.*/seq -s: &/e;s/$/:/;h;d};G;:a;/:/!d;/^\s*\n/{s///;h;$!d;x;s/:/ 0\n/g;s/.$//p;d};s/^(\S+)\s*([^\n]*\n)([^:]*):/\3 \1\n\2/;P;s/[^\n]*\n//;ba' file
        

        这会删除第一行。存储从 1 到第二行中保存的数字的序列,在保存空间中并删除第二行。将下一行的第一个数字与保留空间中的第一个数字配对并添加一个换行符。打印出配对并重复。当最后一行的最后一个数字匹配时,剩下的任何序列号都与零配对。

        【讨论】:

        • 这为给定日期提供了正确的输出,但在计数器以 4096 行结束之前它不会停止。它不会在 4096 记录之后和列号 2 之后开始
        • @Jotne 我不明白你的评论。您的意思是,即使第二行指示 4096 行,一旦数据用完,该过程就应该停止?但是,我在解决方案中发现了一个关于文件结束条件的错误,因此暂时将其删除。
        【解决方案6】:

        这是awk的另一种方式:

        awk 'NR>2{for(x=1;x<=NF;x++) print y++,$x}' file
        

        测试:

        $ cat file
        CHO 1
        4096
        26 20 0 0 0 0 0 0 0 0
        0 0 0 0 0 3 5 15 8 14
        9 7 13 10 12 9 5 3 3 2
        2 0 0 0 0 0 0 1 1 0
        0 0 0 0 0 0 0 0 0 0
        0 0 0 0 1 0 1 0 0 0
        0 0 0 0 0 0 1 0 0 0
        0 0 0 0 1 0 0 0 0 0
        6 8 5 5 7 13 13 33 23 29
        44 51 56 42 39 31 21 24 18 18
        18 30 44 43 51 67 102 110 130 130
        100 96 87 49 25 16 4 1 1 0
        0 0 0 0 0 0
        

        $ awk 'NR>2{for(x=1;x<=NF;x++) print y++,$x}' file
        0 26
        1 20
        2 0
        3 0
        4 0
        5 0
        6 0
        7 0
        ---
        ---
        122 0
        123 0
        124 0
        125 0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多