awk没有在csv的最后一列中进行替换

我需要跨过大.tsv的列,如果列名称与多个字符串中的任何一个匹配,则替换该列名称,如果找不到匹配项,则将其标记为错误。下面是我所拥有的简化版本,它在这里有效。

以制表符分隔的输入test.tsv的示例:

Col1    Col2    Col3    Col4
A   B   C   Foo
D   E   F   Bar
G   H   I   Baz

脚本:

#!/bin/bash

set -eu
shopt -s failglob

awk 'BEGIN {FS=OFS="\t"} \
     {if (NR==1) \
        {for (i = 1 ; i <= NF ; i++) \
        if ($i == "Col1") { $i = "NewCol1" } \
        else if ( $i == "Col2") { $i = "NewCol2" } \
        else if ( $i == "Col4") { $i = "NewCol4" } \
        else { $i = "Error: "$i } \
        } print \
        }' test.tsv

制表符分隔的输出:

NewCol1 NewCol2 Error: Col3 NewCol4
A   B   C   Foo
D   E   F   Bar
G   H   I   Baz

但是,在我的实际流程中,Col4没有得到成功处理。而是将其标记为错误。如果我使用LibreOffice Calc打开文件并再次将其保存为.tsv,则不会发生此问题。这使我认为这可能是行尾格式问题,但是我已经使用vim来检查输入文件中的结尾,并且它们始终为\n。我在这里想念什么?

looven23 回答:awk没有在csv的最后一列中进行替换

很明显,您输入的行以^M\r结尾。您可以将此awkRS中的自定义正则表达式一起使用(这需要GNU awk):

awk -v RS='\r?\n' '...' file

-v RS='\r?\n'设置RS或将分隔符记录为可选 \r,后跟\n,从而使其与以{{1 }}或\n

本文链接:https://www.f2er.com/3135467.html

大家都在问