在运行awk命令以删除最后一列后保留定界符'\ t'

时间:2018-10-29 08:39:53

标签: linux awk

我发现以下命令可以从文件中删除最后一列

awk 'NF{NF-=1};1' <in >out

命令从此处复制。 https://unix.stackexchange.com/questions/234432/how-to-delete-the-last-column-of-a-file-in-linux?newreg=b1ebf81f0ea5458eafc3370a6739b1a9

问题来了。该文件最初由'\ t'分隔,在执行此命令后,分隔符不再为'\ t'。有人知道原因吗?以及如何保留定界符?

3 个答案:

答案 0 :(得分:1)

您必须定义输出分隔符:

open

注释::重新定义变量open class MyClasss{}是POSIX的未定义行为,但GNU awk和其他一些awk版本允许这样做。

以下对于任何awk都可以很好地工作:

awk 'BEGIN{FS=OFS="\t"}NF{NF-=1};1' input > output

非常了解两个概念:

  • records :将文件拆分为记录,其中每个记录由记录分隔符NF与另一个记录分隔。默认情况下,这是字符,因此记录是行。
  • fields :将记录分为多个字段,其中每个字段由字段分隔符awk 'BEGIN{FS="\t"}{sub(FS "[^"FS"]*$","")}1' input > output 分隔。默认情况下,这是任何空白序列(空格和制表符)。

很显然,如果您可以通过定义记录分隔符RS和字段分隔符FS来定义输入的构建方式,则还可以告诉awk输出的构建方式。因此,您可以定义输出记录分隔符RS,当您使用FS语句时,该分隔符将附加在每个打印记录之后。在ORS旁边,您可以定义输出字段分隔符print,该分隔符告诉awk如何拆分字段。通常,将打印语句中的每个ORS运算符替换为OFS,例如:

,

将打印

OFS

当您更改字段或删除某些字段时,完整记录print field1, field2, field3 也将用field 1 OFS field2 OFS field3 ORS 重新定义为字符串。

另一种解决方案可能是使用$0OFS

rev

答案 1 :(得分:1)

awk '{sub(/\t[^\t]*$/,"")}1' file

以上内容可在任何awk中使用。

答案 2 :(得分:1)

以下是一些替代解决方案,希望它们可以为您提供一些选择。

for (var i = 0; qs[i]; i++) {
    if (counter == i + 1 && answer == userInput) {
        qs[i].style.backgroundColor = "green";
    } else {
        qs[i].style.backgroundColor = "red";
    }
}