如何用AWK解析tsv文件

问题描述 投票:0回答:3

我需要使用 awk 解析、迭代 .tsv 文件。

文件路径正确,已在终端测试。 收到错误“cat:./datalist.tsv 没有这样的文件或目录

tsv 文件有几行,制表符分隔。计划是循环遍历 tsv 文件内容。

这是我的代码,用于 filename.awk :

csv awk
3个回答
1
投票

您不必使用

cat
来读取 TSV 文件。相反,直接读取文件即可。

例如:

#!/bin/gawk
BEGIN {
    FS = "\t"
    OFS = ","
    ORS = "\r\n"
    while (( getline < "datalist.tsv" ) > 0) {
        print $1,$2,$3
    }
}

输入示例(字段之间的所有空格只是一个制表符):

1   2   3
ab  bc  cd
abc bcd cde

输出示例:

1,2,3
ab,bc,cd
abc,bcd,cde

注意:如果 TSV 文件中的字段中从来没有空格(就像在我的示例输入中一样),您甚至不需要更改字段分隔符

FS="\t"
,因为默认情况下字段将按空格和制表符拆分。


1
投票

你把事情过于复杂化了。 为什么要在

BEGIN
块中进行读取以及为什么将
OFS
设置为除您显然实际想要的输出分隔符之外的其他内容?

awk 'BEGIN { FS="\t"; OFS="_"; ORS="\"\r\n" } { print $1, $2, $3 }' ./datalist.tsv

如果文件是正确 TSV,则您可能需要解决一些问题。该格式允许字段包含位于双引号内的分隔符;显然,您正在阅读的文件确实有双引号(为什么还要将

"
放在
ORS
中?)所以完整的解决方案将解析引号并忽略字段分隔符(如果它位于一对(未转义的)内) !) 引号。 (参见例如这个问题。)


0
投票

简短而简单:

awk -F'\t' '{ print $1 }`

将打印所有第一个字段。它将字段分隔符设置为制表符,就像在 TSV 中一样。所以

$2
将是第二个字段等,
$0
整行照常。

显然OP的错误与awk无关。

© www.soinside.com 2019 - 2024. All rights reserved.