以最后一列为参考删除列

时间:2019-07-12 12:47:35

标签: awk sed

我希望删除倒数第三列和倒数第二列,并使用bash打印其余的列。例如。

System.IO.FileNotFoundException: Could not load assembly 'Uber Rider, Version=0.0.0.0, Culture=neutral, PublicKeyToken='. Perhaps it doesn't exist in the Mono for Android profile?
File name: 'Uber Rider.dll'
   at Java.Interop.Tools.Cecil.DirectoryAssemblyResolver.Resolve(AssemblyNameReference reference, ReaderParameters parameters)
   at Java.Interop.Tools.Cecil.DirectoryAssemblyResolver.GetAssembly(String fileName)
   at Xamarin.Android.Tasks.LinkAssemblies.Execute(DirectoryAssemblyResolver res)
   at Xamarin.Android.Tasks.LinkAssemblies.Execute()
   at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext()         

现在以最后一列为参考($ NF),我需要删除倒数第三列和倒数第二列。

所需的输出应类似于下面应删除I J的每一行。

Line 1 ------ A B C D E F G H I J K
Line 2 ------ A B C D E F E F I G H I J M
Line 3 ------ A B C D E I J Y
Line 4 ------ A B C D A B C D F G J E F G H I J C

谢谢

3 个答案:

答案 0 :(得分:1)

取决于要保留还是折叠已删除字段周围的分隔符:

$ awk '{$(NF-2)=$(NF-1)=""}1' file
Line 1 ------ A B C D E F G H   K
Line 2 ------ A B C D E F E F I G H   M
Line 3 ------ A B C D E   Y
Line 4 ------ A B C D A B C D F G J E F G H   C

$ awk '{$(NF-2)=$(NF-1)=""; $0=$0; $1=$1}1' file
Line 1 ------ A B C D E F G H K
Line 2 ------ A B C D E F E F I G H M
Line 3 ------ A B C D E Y
Line 4 ------ A B C D A B C D F G J E F G H C

您在有关...retains my tab delimiter的评论中说。如果您的字段用制表符分隔,请在您的问题中注明,并在脚本开头添加BEGIN{FS=OFS="\t"}

答案 1 :(得分:0)

您可以通过awk内的for循环来做到这一点:

awk '{for(i=1;i<=NF;++i){if (i<NF-2||i==NF){printf i==NF?"%s\n":"%s ", $i}}}'

这只是循环遍历所有列,如果该列不是最后一列的第二或第三列,则它将打印该列,如果是最后一列,则会附加换行符。

在awk中可能有一种更漂亮的方法,但是它可以工作。

答案 2 :(得分:0)

这可能对您有用(GNU sed):

sed -E 's/(\s+\S+){3}$/\1/' file

将每行的最后3个字段替换为最后3个字段。