Следующая программа возьмет данные из вашего файла, разделит их и сохранит в новом файле.
./split.py
#!/usr/bin/python
import sys
file = open(sys.argv[1],'r')
list = file.readlines()
headerstart = list[0].split('\t')
header = headerstart[0] + '\t' + headerstart[1] + '1\t' + headerstart[1] + '2\t' + headerstart[2]
def makeList(input):
out = []
for y in list[1:]:
x = y.split('\t')
out.append(x[0] + '\t' + x[1][0] + '\t' + x[1][1] + '\t' + x[2])
return out
file = open(sys.argv[2],'w')
file.write(header)
for x in makeList(list):
file.write(x)
file.close()
Вы можете запустить его со стандартными аргументами с помощью ./split. py
Он возьмет список файлов, разделит его на основе \t
tab, затем еще разделит вторую колонку пополам, разделит по tab и сохранит в newfilename
Этот ответ может быть изменен для удовлетворения других требований, если дана другая информация.
output
Id allele1 allele2 id2
30 T C 12
211 G G 12
327 A A 13
688 T C 15
760 T T 18
868 C C 90
Из man bash
, опции дляset
:
-f Disable pathname expansion.
Итак, вопрос
set -f
, чтобы отключить подстановку, а затем
set +f
на повторное -для включения нормального поведения подстановки.
Чуть более длинный соответствующий отрывок из справочной страницы:
Pathname Expansion
After word splitting, unless the -f option has been set, bash scans each word for the characters *, ?, and [. If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of file names matching the pattern.
Часть echo …
в обратных кавычках дает строку (без кавычек ).*
, которая впоследствии расширяется с помощью BASH. Если вы не хотите, чтобы «.*» расширялся до списка файлов, просто используйте list=(".*")
. Однако я не вижу, для чего может быть полезна последующая итерация по такому массиву.
list=(`echo ".*"`)
В приведенном выше примере подстановка команд не заключена в кавычки, поэтому результирующий вывод подвержен разбиению на слова и подстановке.
for item in ${list[@]}; do echo "$item"; done;
Кроме того, здесь у вас нет кавычек вокруг ${list[@]}
, так что снова , это подвержено разделению слов и подстановке. (Это будет иметь значение, если вы добавите кавычки в задание или если какие-либо совпадающие имена файлов содержат пробелы или символы подстановки...)
Если вам нужна просто буквальная строка .*
, используйте list=(".*")
и for item in "${list[@]}";...
. Если вы хотите использовать подстановку команд, заключите ее в кавычки, например "$(somecmd)"
.
См. также: