Выполнить замену / удаление символов только в одном столбце файла с разделителями? - PullRequest
1 голос
/ 14 февраля 2012

У меня есть CSV-файл, который имеет два столбца, числовой идентификатор (IDVAR) и соответствующее значение (VAL).Вторая переменная содержит не алфавитные символы мусора, которые необходимо очистить.Структура выглядит следующим образом:

IDVAR   VAL
001     abc - 1
002     zfas $^6
003     asdf_78
004     hg :65

Я хочу выбросить "-", "_", "1", "$", "^" и т. Д. Только из 2-й переменной, т.е. удалить указанный набор символов из VAL, не касаясь IDVAR.

Редактирование после решения: Большое спасибо SiegeX за такое элегантное решение.Обратите внимание, что мой файл действительно разделен запятыми, поэтому мне просто нужно добавить опцию "-F" в его команду awk.

Ответы [ 3 ]

4 голосов
/ 14 февраля 2012

Это будет работать для вас:

awk 'NR>1{t=$1;gsub(/[^[:alpha:]]/,"");$0=t "\t" $0}1' file

Пример

$ awk 'NR>1{t=$1;gsub(/[^[:alpha:]]/,"");$0=t "\t" $0}1' file
IDVAR   VAL
001     abc
002     zfas
003     asdf
004     hg

Объяснение

  1. NR>1: пропустить строку заголовка, содержащую IDVAR VAL
  2. t=$1: сохранить первое поле (IDVAR) во временную переменную 't'
  3. gsub(/[^[:alpha:]]/,""): регулярное выражение, которое говорит заменить все не -буквенно-цифровые символы напустая строка.Примечание gsub() относится ко всей строке, поэтому мы использовали 't' выше
  4. $0=t "\t" $0: добавьте переменную 't' к началу строки, разделенной табуляцией
  5. 1: ярлык Awk для print $ 0 , поскольку '1' всегда истинно, и поведение по умолчанию для оператора true, если явно не указано, заключается в печати текущей строки.
1 голос
/ 14 февраля 2012
cut -f1 -d, foo > foo.firstColumn
cut -f2 -d, foo \
    | sed 's/[-_1$^]//g' \
    | paste foo.firstColumn - \
    > foo.stripped
rm foo.firstColumn
0 голосов
/ 14 февраля 2012

Я бы использовал Perl, но это потому, что я использую Perl для многих целей манипулирования текстом, подобных этой.

perl -n -e 'chomp; my($f1,$f2) = $_ =~ m/(\S+)\s+(\S.*)/;
            $f2 =~ s/[-_\$^1]//g; print "$f1\t$f2\n";' file

За исключением SO, это может быть одна строка. Вы должны быть немного осторожнее с $, ^ и -, но другие символы могут быть добавлены довольно легко.

Дайте ваш пример ввода и список символов, которые нужно исключить, вывод:

IDVAR   VAL
001     abc  
002     zfas 6
003     asdf78
004     hg :65

Может быть, слово «например» должно было содержать пробел, двоеточие и другие цифры?

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