如何在AWK中使用字符长度分隔列

大众能源

我有一个数据,该数据未根据适当的字段分隔符进行格式化(这是awk擅长的)。但是,我所知道的是,数据是固定宽度的。

 NODE     S1           S2           S3           SINT         SEQV    
   1  0.14919     -0.58396E-001-0.71230      0.86149      0.77873     
   2  0.56037E-001 0.23261E-002-0.37154      0.42757      0.40341     
   3  0.52036E-001 0.19762E-001-0.27222      0.32426      0.30939     
   4  0.59765E-001 0.22059E-001-0.24529      0.30505      0.28806     
   5  0.70704E-001-0.51976E-002-0.13862      0.20932      0.18354     
   6  0.11906      0.44607E-001-0.17493      0.29399      0.26474     
   7  0.25540      0.95993E-002-0.43110      0.68650      0.60246     
   8  0.52246E-001-0.47008E-001-0.35167      0.40391      0.36456     
   9  0.32215E-001-0.62291E-001-0.28800      0.32021      0.28497     
  10  0.28072E-001-0.68269E-001-0.28304      0.31111      0.27586     
  11  0.25990E-001-0.78663E-001-0.28626      0.31225      0.27527     
  12  0.26657E-001-0.79217E-001-0.29507      0.32173      0.28400     

预期的输出是这样的(其他列中的数字可以采用S2中数据其他部分的格式):

  NODE       S1           S2           S3           SINT         SEQV    
   1    0.14919       -0.58396E-001  -0.71230      0.86149      0.77873     
   2    0.56037E-001   0.23261E-002  -0.37154      0.42757      0.40341     
   3    0.52036E-001   0.19762E-001  -0.27222      0.32426      0.30939     
   4    0.59765E-001   0.22059E-001  -0.24529      0.30505      0.28806     
   5    0.70704E-001  -0.51976E-002  -0.13862      0.20932      0.18354     
   6    0.11906        0.44607E-001  -0.17493      0.29399      0.26474     
   7    0.25540        0.95993E-002  -0.43110      0.68650      0.60246     
   8    0.52246E-001  -0.47008E-001  -0.35167      0.40391      0.36456     
   9    0.32215E-001  -0.62291E-001  -0.28800      0.32021      0.28497     
  10    0.28072E-001  -0.68269E-001  -0.28304      0.31111      0.27586     
  11    0.25990E-001  -0.78663E-001  -0.28626      0.31225      0.27527     
  12    0.26657E-001  -0.79217E-001  -0.29507      0.32173      0.28400     

主要问题是,有时列之间用空格隔开,有时没有空格('-'符号占据空格),即没有适当的字段分隔符。我在这里发现了一个类似的问题,但是数据在字段分隔符方面是一致的。根据我的想法,可能有两种方法

  1. 使用字符长度。例如,从第二行开始,每行字符为74或75。
  2. 使用栏位宽度:不知道AWK是否可行。

我是AWK的新手,我知道使用其他工具可能很容易,但是我想知道是否可以使用awk分离/提取这些列。我在MacOS的终端中使用awk。

大众能源

尽管JNevillAndriy Makukha的回答就其自身权利而言是不错的选择,但我想专门使用NAWK(MacOS默认AWK)解决该问题。我发现“ FIELDWIDTHS”是gawmo的唯一功能Grymoire machelp

抓住是用

FS=""

将每个字符视为一个字段。由于字段的宽度相等,因此可以在知道每一列的字符数时提取每一列。例如,如果要提取第一,第二,第三和最后一列,则可以使用以下代码(如果源数据名为:test_input.txt):

awk 'BEGIN{FS=""}{print $1$2$3$4"\t"$5$6$7$8$9$10$11$12$13$14$15$16$17$18"\t"$19$20$21$22$23$24$25$26$27$28$29$30$31"\t"$59$60$61$62$63$64$65$66$67$68$69$70}' test_input.txt

输出:

NODE         S1             S2             SEQV    
   1      0.14919       -0.58396E-001   0.77873     
   2      0.56037E-001   0.23261E-002   0.40341     
   3      0.52036E-001   0.19762E-001   0.30939     
   4      0.59765E-001   0.22059E-001   0.28806     
   5      0.70704E-001  -0.51976E-002   0.18354     
   6      0.11906        0.44607E-001   0.26474     
   7      0.25540        0.95993E-002   0.60246     
   8      0.52246E-001  -0.47008E-001   0.36456     
   9      0.32215E-001  -0.62291E-001   0.28497     
  10      0.28072E-001  -0.68269E-001   0.27586     
  11      0.25990E-001  -0.78663E-001   0.27527     
  12      0.26657E-001  -0.79217E-001   0.28400

这是一个简单但有些复杂的解决方案,但到目前为止,它对我来说适用于大数据。任何进一步的改进都将受到欢迎...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在AWK中使用字符串变量打印列

如何在awk中使用printf来指定列分隔的命令输出

如何在 SQL 数据透视表中使用字符串类型列

如何在熊猫数据框的列中使用字符串列表

如何在古吉拉特语中使用字符串构建查询获取记录的列标题?

如何在 for 循环中使用字符串值作为列选择器

如何在awk中使用^#$作为记录分隔符?

如何在数组中使用字符串?

如何在bash中使用字符串数组

如何在Go中使用字符串文字

如何在Android日期格式中使用字符'd'

如何在Excel中使用字符求和

如何在@formula宏中使用字符变量?

如何在:: before伪元素中使用字符代码

如何在Java中使用字符的equals()方法

如何在脚本中使用字符+,-,x,/作为参数

如何在多个线程中使用字符串

如何在RcppEigen中使用字符串变量

如何在Swift中使用字符串获取

如何在if条件中使用字符值(c++)

如何在Spark SQL子字符串中使用列值作为分隔符?

如何在R中使用Tidyr将字符串列分隔为其他多个列

awk -cut如何使用字段分隔符删除第二列

如何在 bash 脚本中使用 Bash/Sed/Awk/Perl 删除分隔字符串的最后一个元素

如何在C中使用strlen()找到字符指针的长度?

在Linux中使用AWK分隔列

如何在oracle数据库中使用字符串创建TRIGGER列ID自动增量?

如何在Linq to Entities中使用字符串在SQL Server 2008+中搜索varbinary列

如何在SQL Server中使用字符和数字(如字母数字)创建自动增量列?