Awk 在文件列中删除

Awk 在文件列中删除,awk,Awk,我正在尝试删除多个文件的最后4列。我正在使用gawk函数。它为一些文件工作。但是,在某些输出文件中,没有任何行或行数少于输入文件 gawk '{print >$NF".txt"} meta.txt| gawk -i inplace '{NF-=4; print}' *.txt 我在这里做错什么了吗 修改/更新:如果两个命令都单独运行,而不使用pipegawk-i inplace,则可以完美地工作。您显然在做的事情没有意义。不要创建包含所有字段的文件,然后从刚创建的每个文件中删除最后4

我正在尝试删除多个文件的最后4列。我正在使用gawk函数。它为一些文件工作。但是,在某些输出文件中,没有任何行或行数少于输入文件

  gawk '{print >$NF".txt"} meta.txt| gawk -i inplace '{NF-=4; print}' *.txt
我在这里做错什么了吗


修改/更新:如果两个命令都单独运行,而不使用pipegawk-i inplace,则可以完美地工作。

您显然在做的事情没有意义。不要创建包含所有字段的文件,然后从刚创建的每个文件中删除最后4个字段,只需在创建文件时不打印最后4个字段即可:

awk '{out=$NF".txt"; NF-=4; print > out}' meta.txt
要不影响其余字段中的字段分隔符,请改为使用以下选项:

awk '{out=$NF".txt"; sub(/(\s+\S+){4}$/,""); print > out}' meta.txt

以上两种假设都是你;重新使用GNU awk-第一个用于减少NF,实际更改$0,第二个用于\s/\s速记。

这可能会影响文件格式。在所有文件上尝试dos2unix。@Jotne尝试了dos2unix。没有改进。然后您应该尝试1和1文件,看看这些文件有什么不同。在这里发布一个不起作用的示例文件。删除管道,按顺序执行,gawk'{print>$NF.txt}meta.txt;gawk-i替换“{NF-=4;print}”*。txtI不是建议您从元文件中删除它们,而是建议您不必先打印所有字段,然后删除其中的4个字段,而只需首先打印除4个之外的所有字段。我添加了一个答案来演示。谢谢。我不太好;所以我试着用有限的知识去做。我还有一个不太重要的问题。我的输入以制表符和空格作为分隔符。但在输出文件中,它是唯一的空间。我可以在输出中也使用输入分隔符吗?