请看下面的命令:
gawk -F"\t" "BEGIN{OFS=\"\t\"}{$2=$3=\"\"; print $0}" Input.tsv
当我设置$ 2 = $ 3 =“”,预期的效果得到尽可能写同样的效果:
print $1,$4,$5...$NF
然而,实际发生的事情是,我得到两个空字段,用额外的字段分隔符仍然打印。
是否有可能真正删除$ 2和$ 3'
注:如果这是在Linux上的bash
,正确的说法上面会以下,但Windows不处理单引号以及在cmd.exe
。
gawk -F'\t' 'BEGIN{OFS="\t"}{$2=$3=""; print $0}' Input.tsv
Answer 1:
这是一个老但糖果。
乔纳森指出,你不能在中间删除字段,但你可以与其他领域的内容替换其内容。 你可以做一个可重复使用的函数来处理删除你。
$ cat test.awk
function rmcol(col, i) {
for (i=col; i<NF; i++) {
$i=$(i+1)
}
NF--
}
{
rmcol(3)
}
1
$ printf 'one two three four\ntest red green blue\n' | awk -f test.awk
one two four
test red blue
Answer 2:
你不能在中间删除字段,但你可以通过递减末删除字段, NF
。
所以,你可以关闭所有的后场转移到覆盖$2
和$3
,然后递减NF
两部分,可清除最后两个字段:
$ echo 1 2 3 4 5 6 7 | awk '{for(i=2; i<NF-1; ++i) $i=$(i+2); NF-=2; print $0}'
1 4 5 6 7
Answer 3:
如果你只是希望删除列,你可以使用cut
:
cut -f 1,4- file.txt
为了模仿cut
:
awk -F "\t" '{ for (i=1; i<=NF; i++) if (i != 2 && i != 3) { if (i == NF) printf $i"\n"; else printf $i"\t" } }' file.txt
类似:
awk -F "\t" '{ delim =""; for (i=1; i<=NF; i++) if (i != 2 && i != 3) { printf delim $i; delim = "\t"; } printf "\n" }' file.txt
HTH
Answer 4:
一种方法可能是像你这样删除字段,并删除与多余的空格gsub
:
awk 'BEGIN { FS = "\t" } { $2 = $3 = ""; gsub( /\s+/, "\t" ); print }' input-file
Answer 5:
在另外的自杀史蒂夫的答案我想建议多了一个解决方案,但使用的sed,而不是awk的。
因为它是由史蒂夫建议似乎比砍的使用更为复杂。 但它是更好的解决方案,因为sed的-i允许就地编辑。
sed -i 's/\(.*,\).*,.*,\(.*\)/\1\2/' FILENAME
Answer 6:
我能想到做到在awk中不使用循环的唯一方法是使用gsub
上$0
到邻近结合FS
:
$ echo {1..10} | awk '{$2=$3=""; gsub(FS"+",FS); print}'
1 4 5 6 7 8 9 10
Answer 7:
好了,如果我们的目标是去除多余的分隔符,那么你可以使用“TR”在Linux上。 例:
$回声 “1,2 ,,, 5” | TR-S ''
1,2,5
Answer 8:
echo one two three four five six|awk '{
print $0
is3=$3
$3=""
print $0
print is3
}'
一二三四五六
一二四五六
三
文章来源: Is there a way to completely delete fields in awk, so that extra delimiters do not print?