удаление пробелов между каждым другим столбцом - PullRequest
0 голосов
/ 22 октября 2018

У меня большой набор данных, который выглядит следующим образом:

ID224912 A A A B B A B A B A B

, и я хочу, чтобы он выглядел следующим образом:

ID224912 AA AB BA BA BA BA

Я попытался изменить этот код, который я где-то нашелеще, но безуспешно:

AWK=''' { printf (""%s %s %s %s"", $1, $2, $3, $4); } 
{ for (f = 5; f <= NF; f += 2) printf (""%s %s"", $(f), $(f + 1)); } 
{ printf (""\n""); } ''' 
awk ""${AWK}"" InFile > OutFile

Есть предложения?

Ответы [ 6 ]

0 голосов
/ 22 октября 2018

Следующая строка

awk '{printf $1}{for(i=2;i<=NF;i+=2) printf OFS $i $(i+1); print "" }'

будет выводить

ID224912 AA AB BA BA BA B

Как вы заметили, у нас есть дополнительный столбец B в конце из-зачетное количество столбцов в исходном выводе.Поскольку OP не хочет этого, мы можем исправить это с помощью простого обновления в условиях цикла for

awk '{printf $1}{for(i=2;i<NF;i+=2) printf OFS $i $(i+1); print "" }'

выведет

ID224912 AA AB BA BA BA
0 голосов
/ 22 октября 2018

Это может сработать для вас (GNU sed):

sed -E 's/((\S+\s\S+\s)*\S+).*/\1/g;s/(\S+\s\S+)\s/\1/g' file

Решение состоит из двух частей.Сначала сгруппируйте пробелы между полями, чтобы они были четным числом, и удалите дополнительное поле, если оно есть.Затем сгруппируйте поля

0 голосов
/ 22 октября 2018

Что касается InFile в качестве входного файла, вы можете использовать sed следующим образом:

cat InFile |sed -e 's/\([a-zA-Z]\)[ \t]\([a-zA-Z]\)/\1\2/g'

NB: с указанным InFile в исходном вопросе (с нечетным количеством букв)результат:

ID224912 AA AB BA BA BA B
0 голосов
/ 22 октября 2018

Для забавы вот решение sed:

cat input | sed 's/\([ A-Z ]\) \([ A-Z ]\)/\1\2/g' > output

Только для пояснения я тестировал на BSD sed.

0 голосов
/ 22 октября 2018
$ awk '{r=$1; for (i=2; i<NF; i+=2) r=r OFS $i $(i+1); print r}' file
ID224912 AA AB BA BA BA
0 голосов
/ 22 октября 2018
  • Вам не нужно назначать скрипт AWK в переменную.Просто вызовите его встроенным, что проще и безопаснее.
  • Выглядит странно, что вы группируете первые четыре поля.Насколько я вижу из вашего желаемого результата, было бы достаточно просто обработать первое поле (ID) отдельно.

Попробуйте что-то вроде:

awk '{printf("%s", $1); for (i=2; i<=NF; i+=2) printf(" %s%s", $i, $(i+1)); print ""}' InFile > OutFile

Надеюсь, что этоhepls.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...