2013-11-11 2 views
0

У меня есть файл данных, который считываетЗаменить весь текст во всех колонках, кроме последнего

field1 field2 diseased 
discrete discrete discrete              
        class 
No Yes No 
Yes Yes Yes 
No No No 

Я хочу, чтобы заменить Нет во всех колонках, кроме последнего столбца с вопросительным знаком (?). Это всего лишь игрушечный пример с тремя столбцами. У меня есть данные с тысячами столбцов. Таким образом, делать индивидуально не будет смысла. Также первые три строки являются заголовками, и я хочу их как есть. Поэтому я хочу, чтобы мой результат был

field1 field2 diseased 
discrete discrete discrete              
        class 
? Yes No 
Yes Yes Yes 
? ? No 

Я хочу сделать это без изменения форматирования файла. Пока я могу сделать это, удалив последний столбец и заменив No и снова добавив последнюю строку, но потеряв форматирование. Также спасибо за помощь. В некоторых случаях, когда есть большое количество Да и последний столбец Нет, некоторые вкладки добавляются в конце. Команда

cat -e test 

приводит

field1 field2 diseased 
discrete discrete discrete              
        class 
? Yes No$ 
Yes Yes Yes 
? ? No 
Yes Yes No $ 

Я не хочу, пространство между последней Нет и $

ответ

3

Как это, например:

$ awk 'BEGIN{OFS=FS="\t"} {for (i=1; i<NF; i++) if ($i=="No") $i="?"}1' a 
?  Yes  No 
Yes  Yes  Yes 
?  ?  No 

Проверяется с 1-го по предпоследнее поле и при необходимости заменяет.

BEGIN{OFS=FS="\t"} используется для установки разделителя полей ввода и вывода в качестве вкладки.

+0

Интересно, что мой файл с разделителями табуляции и изменяется в пространстве файл с разделителями. Но проблема в том, что есть Да во всех столбцах, содержимое с разделителями табуляции.Есть ли простой способ исправить это? – discipulus

+0

@lovedynasty 'BEGIN {FS = OFS =" \ t "}' – jkshah

+0

@lovedynasty да, конечно, только что обновлено блоком 'BEGIN {OFS = FS =" \ t "}'. Надеюсь, это поможет – fedorqui

2

Использование AWK:

awk -v ccol=3 '{for (i=1; i<=NF; i++) if (i != ccol && $i=="No") $i="?"} 1' OFS='\t' file 

Вы можете передать любое значение для ccol, чтобы пропустить этот столбец должен быть заменен.

+0

Интересно, что мой файл имеет разделитель табуляции и он преобразуется в файл с разделителями пространства. Но проблема в том, что есть Да во всех столбцах, содержимое с разделителями табуляции. Есть ли простой способ исправить это? – discipulus

+1

Теперь см. Отредактированную команду, которая использует 'OFS = '\ t'', чтобы сделать разделительную закладку вывода. – anubhava

+0

@lovedynasty: Конечно, эта команда awk не предполагает, что нужно пропустить только последний столбец, поскольку вы можете передать col # в качестве аргумента. – anubhava

0

Другой awk

awk '$1=="No" {$1="?"} $2=="No" {$2="?"} 1' file 
+0

Обратите внимание, что может быть более трех столбцов. – fedorqui

3

Если у вас есть какие-то другие заголовки, которые могут рисковать соответствие No, вы должны уйти с чем-то очень простое, например:

perl -pwe 's/\bNo\b(?!\s*$)/?/g' infile > outfile 

который заменит все No строки которые имеют границы слов вокруг них. Перенаправление оболочки будет сохранять вывод в новом файле. Вы также можете использовать переключатель -i, но я обычно не рекомендую его новым пользователям.

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

+2

Не производит желаемый выход. Заменяет даже в последнем столбце. – jkshah

+1

Ага, я этого не видел. Ну, это легко фиксируется. – TLP

1

Здесь я считаю, что последний столбец не должен заменяться (при необходимости его можно легко адаптировать).

Использование AWK:

[ ~]$ awk '{for (i=1;i<NF;i++){if ($i=="No"){$i="?"}}; print $0}' test.txt 
field1 field2 diseased 
discrete discrete discrete              
        class 
? Yes No 
Yes Yes Yes 
? ? No 

Использование СЭД:

[ ~]$ sed "s/No/\?/g; s/\?\ *$/No/g" test.txt 
field1 field2 diseased 
discrete discrete discrete              
       class 
? Yes No 
Yes Yes Yes 
? ? No 
Смежные вопросы