有没有办法彻底删除AWK领域,这样额外的分隔符不打印?(Is there a way to comp

2019-06-24 15:41发布

请看下面的命令:

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?
标签: awk gawk