Замените значения из других столбцов, если значение одного столбца равно нулю, используя awk / sed - PullRequest
0 голосов
/ 07 января 2012

Я пытаюсь изменить файл с разделителями табуляции, заменив значение 2 столбцов, разделенных ":", если в одном столбце есть нулевое значение:

Начать с этого файла:

id1 id2 pos1    pos2
749 2847443 21  13517135
862 2821796 21  13571669
997     21  13636494
1095    2821826 21  13661335
1131        21  13678797

Я хотел бы изменить столбец 2, чтобы получить следующее:

id1 id2 pos1    pos2
749 2847443 21  13517135
862 2821796 21  13571669
997 21:13636494 21  13636494
1095    2821826 21  13661335
1131    21:13678797 21  13678797

Проблема также заключается в том, что отсутствует пробел (""), указывающий нулевое значение.На данный момент я даже не смог заменить значение столбца 2 на столбец 3, когда оно пустое ...

Я пытался использовать sed:

sed -e 's/\t\t/\t$3\t/g' input.txt > output

, который работает, но этопросто подставляю текст '$ 3', и я не могу найти, как подставить вместо него значения $ 3: $ 4.

Я также пробовал awk:

awk 'BEGIN {
  IFS = OFS = "\t"
 }
{
    for (column = 2; column <= NF; ++column) {
    if ($column == "") {
        $column = $3
    }
 }    
 print 
}         
'
input.txt > output

Но это тоже не работает (на самом деле ничего не делает, ни используя "", ни "...)

Можетпожалуйста, помогите мне?Спасибо.

Ответы [ 2 ]

3 голосов
/ 07 января 2012

Проверка нулевого значения на самом деле легко.но я плохо поняла это требование.какой столбец может быть нулевым?в вашем awk-скрипте у вас есть цикл от $ 2 -> $ NF, если есть пустой столбец, вы не устанавливали разделенные значения ":", а устанавливали с $ 3.что насчет $ 3 равно нулю?

Я предполагаю, что только $ 2 (столбец2) может быть пустым, тогда следующая строка awk должна выполнить эту работу.

 awk -F'\t' -vOFS='\t' '!$2{$2=$3":"$4}1' file

test

<ff is your input file>

kent$  awk -F'\t' -vOFS='\t' '!$2{$2=$3":"$4}1' ff          
id1     id2     pos1    pos2
749     2847443 21      13517135
862     2821796 21      13571669
997     21:13636494     21      13636494
1095    2821826 21      13661335
1131    21:13678797     21      13678797

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

kent$  awk -F'\t' -vOFS='\t' '!$2{$2=$3":"$4}1' ff|column -t
id1   id2          pos1  pos2
749   2847443      21    13517135
862   2821796      21    13571669
997   21:13636494  21    13636494
1095  2821826      21    13661335
1131  21:13678797  21    13678797

надеюсь, что это полезно для вас.

2 голосов
/ 07 января 2012

просматривая опубликованный вами текст до / после

B:    997       21  13636494
A:    997   21:13636494 21  13636494

вы хотите заменить 2-й столбец , если ноль
с 3rd + '**:**' + 4th column, верно?

так иди на это:

sed 's/\(.*\)\t\t\(.*\)\t\(.*\)/\1\t\2:\3\t\2\t\3/g' testfile

соответствует строке с

что-то tabtab что-то tab что-то

и замените его на

Вкладка 1-го столбца 3-й столбец: Вкладка 4-го столбца Вкладка 3-го столбца 4-й столбец

пример:

$ cat testfile
749 2847443 21  13517135
862 2821796 21  13571669
997     21  13636494
1095    2821826 21  13661335
1131        21  13678797

$ sed 's/\(.*\)\t\t\(.*\)\t\(.*\)/\1\t\2:\3\t\2\t\3/g' testfile
749 2847443 21  13517135
862 2821796 21  13571669
997 21:13636494 21  13636494
1095    2821826 21  13661335
1131    21:13678797 21  13678797

Примечание: это выглядит только для отсутствующего 2-го столбца, как то, о чем вы говорили

PS: если вы думаете, что отвечает на ваш вопрос, не забудьте пометить его как правильный ответ

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