Вопрос по – Есть ли способ полностью удалить поля в awk, чтобы лишние разделители не печатались?

12

Рассмотрим следующую команду:

gawk -F"\t" "BEGIN{OFS=\"\t\"}{$2=$3=\"\"; print $0}" Input.tsv

Когда я устанавливаю $ 2 = $ 3 = & quot;, предполагаемый эффект, чтобы получить тот же эффект, что и запись:

print $1,$4,$5...$NF

Однако в действительности я получаю два пустых поля с дополнительными разделителями полей, которые все еще печатаются.

Можно ли реально удалить $ 2 и $ 3?

Примечание: если это было в Linux вbash, правильное утверждение выше будет следующим, но Windows плохо обрабатывает одинарные кавычки вcmd.exe.

gawk -F'\t' 'BEGIN{OFS="\t"}{$2=$3=""; print $0}' Input.tsv
Error: User Rate Limit Exceeded merlin2011
Error: User Rate Limit Exceeded$2=$3="";$0=$0Error: User Rate Limit Exceeded shellter
Error: User Rate Limit Exceeded-vError: User Rate Limit Exceeded Dennis Williamson
Error: User Rate Limit Exceeded merlin2011
Error: User Rate Limit Exceeded$2=$3="XYZ"; sub("\tXYZ\t", "", $0); $0=$0; printError: User Rate Limit Exceeded\tError: User Rate Limit Exceeded shellter

Ваш Ответ

8   ответов
1

sed -i 's/\(.*,\).*,.*,\(.*\)/\1\2/' FILENAME
0

1,2,5

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

Error: User Rate Limit Exceeded{for (...) {printf delim $i; delim = "\t"}; printf "\n"}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded merlin2011
Error: User Rate Limit Exceeded
0

gsub$0FS:

$ echo {1..10} | awk '{$2=$3=""; gsub(FS"+",FS); print}'
1 4 5 6 7 8 9 10
1

gsub:

awk 'BEGIN { FS = "\t" } { $2 = $3 = ""; gsub( /\s+/, "\t" ); print }' input-file
-1
echo one two three four five six|awk '{
print $0
is3=$3
$3=""
print $0
print is3
}'

7

NF.

$2$3NF

$ 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
6

$ 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
Error: User Rate Limit Exceeded

Похожие вопросы