Bash-按位置/索引在列中拆分文本文件

时间:2019-05-09 14:17:59

标签: awk multiple-columns

我有一个文本文件,其结构类似于:

2013-11-22 eps Ind      2400000.23551544    100.    
2013-11-22 eps Ind      2400000.23551544    100.    
2013-11-22 eps Ind      2400000.23551544    100.    
2013-11-22 HD 217987    2400000.23551544    900.        
2013-11-22 TOI-134      2400000.23551544    900.    
2013-11-22 tau Cet      2400000.23551544    60.     
2013-11-22 BD+01   316  2400000.23551544    300.    
2013-11-22 BD+01   316  2400000.23551544    300.    
2013-11-22 BD+01   316  2400000.23551544    300.    
2013-11-22 BD+01   316  2400000.23551544    300. 

,我需要使用bash提取它。我遇到的主要问题是,尽管各列之间用制表符分隔,但列中的名称可能具有制表符或空格,因此在某些情况下使用awk会给我错误的列。如何将文本文件按列分开,但按索引分开?所有列的字符宽度均相同-考虑到空格是字符。每列都有不同的宽度。

请注意,eps IndHD 217987BD+01 316都在同一列上。

谢谢 豪尔赫

3 个答案:

答案 0 :(得分:2)

如果您输入的内容确实是您所说的固定宽度的字段(我假设这就是<table> <tr><td>Row</td></tr> <tr><td>Row</td></tr> <tr><td>Row</td></tr> <tr><td>Row</td></tr> <tr><td>Row</td></tr> <tr><td>Row</td></tr> <tr><td>Row</td></tr> <tr><td>Row</td></tr> <tr><td>Row</td></tr> <tr><td>Row</td></tr> <tr><td>Row</td></tr> <tr><td>Row</td></tr> <tr><td>Row</td></tr> </table>的意思,而不是所有字段在行内和行之间的宽度相同),则使用适用于FIELDWIDTHS的GNU awk:

all columns have the same width in characters

答案 1 :(得分:1)

我建议使用cut工具将数据分成几列。

编辑:如果在列中有列内的可能标签,但带有固定字段,请在字符位置使用cut

cut -c 12-24,45-50 file.txt

答案 2 :(得分:0)

这是使用Python的另一种方法。鲜为人知的秘密是Python可以成为出色的文本处理工具。

#!/usr/bin/env python
import csv
import fileinput
import sys

# Write comma-separated values (CSV) to standard output
writer = csv.writer(sys.stdout)

# For each line of the input, split into columns,
# strip off the leading and trailing white spaces,
# then write the output
for line in fileinput.input():
    columns = [
            line[:11].strip(),    # Index 0 to 10
            line[11:24].strip(),  # Index 11 to 23
            line[24:44].strip(),  # Index 24 to 43
            line[44:].strip()     # The rest
    ]
    writer.writerow(columns)

调用脚本

python script.py data.txt

输出

2013-11-22,eps Ind,2400000.23551544,100.
2013-11-22,eps Ind,2400000.23551544,100.
2013-11-22,eps Ind,2400000.23551544,100.
2013-11-22,HD 217987,2400000.23551544,900.
2013-11-22,TOI-134,2400000.23551544,900.
2013-11-22,tau Cet,2400000.23551544,60.
2013-11-22,BD+01   316,2400000.23551544,300.
2013-11-22,BD+01   316,2400000.23551544,300.
2013-11-22,BD+01   316,2400000.23551544,300.
2013-11-22,BD+01   316,2400000.23551544,300.