Почему bash конвертирует. * В список скрытых файлов в текущем каталоге и как предотвратить это?

Следующая программа возьмет данные из вашего файла, разделит их и сохранит в новом файле.

./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
-1
13.06.2018, 14:51
3 ответа

Из 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.

2
28.01.2020, 05:06

Часть echo …в обратных кавычках дает строку (без кавычек ).*, которая впоследствии расширяется с помощью BASH. Если вы не хотите, чтобы «.*» расширялся до списка файлов, просто используйте list=(".*"). Однако я не вижу, для чего может быть полезна последующая итерация по такому массиву.

2
28.01.2020, 05:06
list=(`echo ".*"`)

В приведенном выше примере подстановка команд не заключена в кавычки, поэтому результирующий вывод подвержен разбиению на слова и подстановке.

for item in ${list[@]}; do echo "$item"; done;

Кроме того, здесь у вас нет кавычек вокруг ${list[@]}, так что снова , это подвержено разделению слов и подстановке. (Это будет иметь значение, если вы добавите кавычки в задание или если какие-либо совпадающие имена файлов содержат пробелы или символы подстановки...)

Если вам нужна просто буквальная строка .*, используйте list=(".*")и for item in "${list[@]}";.... Если вы хотите использовать подстановку команд, заключите ее в кавычки, например "$(somecmd)".

См. также:

4
28.01.2020, 05:06

Теги

Похожие вопросы