[英]How can I use multiple field separators or multiple awk to process columns
[英]How to remove several columns and the field separators at once in AWK?
我有一個包含數千列的大文件。 我想在Bash中使用AWK一次刪除一些特定的列和字段分隔符。
我可以使用此oneliner一次刪除一列(第3列將被刪除,其對應的字段分隔符):
awk -vkf=3 -vFS="\t" -vOFS="\t" '{for(i=kf; i<NF;i++){ $i=$(i+1);}; NF--; print}' < Big_File
但是,我想一次刪除幾個列...有人可以幫我解決這個問題嗎?
您可以將要從shell中刪除的列的列表傳遞給awk
如下所示:
awk -vkf="3,5,11" ...
然后在awk
程序中將其解析為數組:
split(kf,kf_array,",")
然后通過所有列並測試每個特定列是否在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
}
'
如果你可以使用cut
而不是awk
,這個更容易cut
:
例如,這會從文件中獲取列1,3和50:
cut -f1,3,50- file
這樣的事情應該有效:
awk -F'\t' -v remove='3|8|5' '
{
rec=ofs=""
for (i=1;i<=NF;i++) {
if (i !~ "^(" remove ")$" ) {
rec = rec ofs $i
ofs = FS
}
}
print rec
}
' file
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.