我需要使用 awk 解析、迭代 .tsv 文件。
文件路径正确,已在终端测试。 收到错误“cat:./datalist.tsv 没有这样的文件或目录”
tsv 文件有几行,制表符分隔。计划是循环遍历 tsv 文件内容。
这是我的代码,用于 filename.awk :
您不必使用
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"
,因为默认情况下字段将按空格和制表符拆分。
你把事情过于复杂化了。 为什么要在
BEGIN
块中进行读取以及为什么将 OFS
设置为除您显然实际想要的输出分隔符之外的其他内容?
awk 'BEGIN { FS="\t"; OFS="_"; ORS="\"\r\n" } { print $1, $2, $3 }' ./datalist.tsv
如果文件是正确 TSV,则您可能需要解决一些问题。该格式允许字段包含位于双引号内的分隔符;显然,您正在阅读的文件确实有双引号(为什么还要将
"
放在ORS
中?)所以完整的解决方案将解析引号并忽略字段分隔符(如果它位于一对(未转义的)内) !) 引号。 (参见例如这个问题。)
简短而简单:
awk -F'\t' '{ print $1 }`
将打印所有第一个字段。它将字段分隔符设置为制表符,就像在 TSV 中一样。所以
$2
将是第二个字段等,$0
整行照常。
显然OP的错误与awk无关。