我需要跨一个大的列工作,.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
。我在这里想念什么?
显然,您输入的行以^M
或结尾\r
。您可以将其awk
与自定义正则表达式一起使用RS
(这需要GNU awk
):
awk -v RS='\r?\n' '...' file
-v RS='\r?\n'
设置RS
或记录分隔符作为可选的 \r
后跟\n
,从而允许它匹配以\n
或结尾的行\r\n
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句