вид транспонирования необходимого файла с непоследовательным количеством столбцов в каждой строке - PullRequest
1 голос
/ 17 июня 2011

У меня есть файл с разделителями табуляции (в котором число столбцов в каждой строке не зафиксировано), который выглядит следующим образом:

chr1 92536437 92537640 NM_024813 NM_053274

Я хочу получить файл из этого в следующем порядке (первые тристолбцы - это идентификаторы, которые мне нужны при его разбиении)

chr1 92536437 92537640 NM_024813
chr1 92536437 92537640 NM_053274

Предложения для сценария оболочки.

Ответы [ 4 ]

4 голосов
/ 17 июня 2011
#!/bin/bash
{
    IFS='   '
    while read a b c rest
    do
        for fld in $rest
        do
            echo -e "$a\t$b\t$c\t$fld"
        done
    done
}

Обратите внимание, что вы должны войти в реальную вкладку (IFS)

Я также подумал, что должен сделать версию Perl:

#!/bin/perl -n
($a,$b,$c,@r)=(chomp and split /\t/); print "$a\t$b\t$c\t$_\n" for @r

Чтобы сделать все это изкомандная строка, чтение из in.txt и вывод в out.txt:

perl -ne '($a,$b,$c,@r)=(chomp and split /\t/); print "$a\t$b\t$c\t$_\n" for @r' in.txt > out.txt

Конечно, если вы сохраните скрипт perl (скажем, как script.pl)

perl script.pl in.txt > out.txt

Если вытакже сделайте исполняемый файл скрипта (chmod +x script.pl):

./script.pl in.txt > out.txt

HTH

3 голосов
/ 17 июня 2011

Не оболочка, и другой ответ прекрасно, но я выделил его в perl:

perl -F'/\s/' -lane '$,="\t"; print @F,$_ for splice @F,3' $FILE

Редактировать : Новая (еще более нечитабельная) версия, вдохновленная другими ответами. Злоупотребление параметрами командной строки perl и специальными переменными для автоматического разделения и обработки окончания строки.

Средства: для каждого из полей после первых трех (for splice @F,3) выведите первые три и его (print @F,$_).

-F устанавливает разделитель полей на \s (должен быть \t) для -a автоматического разделения на @F.

-l включает обработку окончания строки для -n, которая запускает код -e для каждой строки ввода.

$, - разделитель выходного поля.

1 голос
/ 17 июня 2011

[Изменено]

То есть вы хотите дублировать первые три столбца для каждого оставшегося элемента?

$ cat File | while read X
      do PRE=$(echo "$X" | cut -f1-3 -d ' ')
      for Y in $(echo "$X" | cut -f4- -d ' ')
          do echo $PRE $Y >> OutputFilename
      done
  done

Возвращает:

chr 786 789 NM
chr 786 789 NR
chr 786 789 NT
chr 123 345 NR

Это обрезает первые три столбца с разделителями-пробелами в качестве префикса, а затем использует тот факт, что цикл for будет проходить по списку с разделителями-пробелами, вызывая echo.

Наслаждайтесь.

0 голосов
/ 17 июня 2011

Это лишь часть вашего сравнения данных в двух файлах вопрос.

Извлечение оттуда моего слегка хакерского решения:

for i in 4 5 6 7; do join -e _ -j $i f f -o 1.1,1.2,1.3,0; done | sed '/_$/d'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...