我有一个文本文件,其结构类似于:
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 Ind
,HD 217987
和BD+01 316
都在同一列上。
谢谢 豪尔赫
答案 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.