我有一个包含数千列的大文件.我想在Bash中使用AWK一次删除一些特定的列和字段分隔符.
我可以使用此oneliner一次删除一列(第3列将被删除,其对应的字段分隔符):
awk -vkf=3 -vFS="\t" -vOFS="\t" '{for(i=kf; i<NF;i++){ $i=$(i+1);}; NF--; print}' < Big_File
Run Code Online (Sandbox Code Playgroud)
但是,我想一次删除几个列...有人可以帮我解决这个问题吗?
您可以将要从 shell 中删除的列列表传递给awk这样的:
awk -vkf="3,5,11" ...
Run Code Online (Sandbox Code Playgroud)
然后在awk程序中将其解析为数组:
split(kf,kf_array,",")
Run Code Online (Sandbox Code Playgroud)
然后遍历所有列并测试每个特定列是否在 kf_array 中并可能跳过它
另一种可能性是多次致电您的oneliner :-)
这是卡米尔想法的实现:
awk -v remove="3,8,5" '
BEGIN {
OFS=FS="\t"
split(remove,a,",")
for (i in a) b[a[i]]=1
}
{
j=1
for (i=1;i<=NF;++i) {
if (!(i in b)) {
$j=$i
++j
}
}
NF=j-1
print
}
'
Run Code Online (Sandbox Code Playgroud)