![linux +从文本文件生成具有特定结构的新文件最好的选择是什么](https://linux22.com/image/581653/linux%20%2B%E4%BB%8E%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E7%94%9F%E6%88%90%E5%85%B7%E6%9C%89%E7%89%B9%E5%AE%9A%E7%BB%93%E6%9E%84%E7%9A%84%E6%96%B0%E6%96%87%E4%BB%B6%E6%9C%80%E5%A5%BD%E7%9A%84%E9%80%89%E6%8B%A9%E6%98%AF%E4%BB%80%E4%B9%88.png)
在我的 Linux 机器上,我有文件 orig-file.txt
此文件现在包含 4 个字段,但可能更少或更多(此文件由其他应用程序生成)
我需要建议 - 将 orig-file.txt 转换为 output-file.txt 文件的最佳选择是什么(可以通过 shell 脚本或 awk 等)
目标是将orig-file.txt文件翻译为output-file.txt(如下面我的例子),同时需要记住orig-file.txt中的字段数量可以更改为更多或更少
最好的选择是什么?(我很高兴得到真实的例子)
原始文件.txt
CREATE_TIMESTAMP TELEPHONE_NUMBER ID TYPE
------------------- -------------------- ---------- -----------------
24-09-2009 16:17:45 33633333333 20 other_mmm_phone
24-09-2009 17:45:07 33644444444 20 other_mmm_phone
07-10-2009 10:45:49 12312312312 20 legacyphone
07-10-2009 11:46:38 59320000043 20 other_mmm_phone
输出文件.txt
CREATE_TIMESTAMP -> 24-09-2009 16:17:45
TELEPHONE_NUMBER -> 33633333333
ID -> 20
TYPE -> other_mmm_phone
---
CREATE_TIMESTAMP -> 24-09-2009 16:17:45
TELEPHONE_NUMBER -> 33633333333
ID -> 20
TYPE -> other_mmm_phone
---
通过 AWK 解决但不起作用 - :(
awk 'FNR == 1 {
for (i = 1; i <= NF; i++) { header[i] = $i } FNR > 2 { for (i = 1; i<= NF; i++) { print header[i], "->", $i } printf "\n\n\n%s\n\n\n", "--------" }' output.csv
awk: syntax error near line 5
awk: illegal statement near line 5
答案1
What the best option to do that
。
您已经了解的工具可能是最好的。如果您熟悉 awk,那么 awk 就很好。如果您熟悉 perl、python、ruby 等,那么其中一个可能不错。对于看似微不足道的编程任务,选择您最喜欢的工具。
答案2
如果我想这样做,我会使用 Perl 脚本来完成。
- 从输入文件中读取第一行并将其保留为标题。
- 跳过一行。
- 继续逐行阅读。对于每一行,
- 使用 根据定义的分隔符来分割线
split
。 - 根据所需的格式将返回值与头文件一起打印。
- 使用 根据定义的分隔符来分割线
您需要在字段之间使用固定分隔符(例如)\t
或固定长度的字段,以便能够可靠地拆分字段。
答案3
这将适应任意数量的字段。
awk 'FNR == 1 {
for (i = 1; i <= NF; i++) {
header[i] = $i
}
}
FNR > 2 {
for (i = 1; i<= NF; i++) {
print header[i], "->", $i
}
printf "\n\n\n%s\n\n\n", "--------"
}' inputfile
需要进行一些调整才能处理时间戳包含空格的情况。字段之间用什么分隔?如果只有制表符,那么您可以使用-F '\t'
或-F '\t+'
。