как сохранить три входа в файл с тем же именем, что и у пользователя?

Существует множество способов обработки CSV в командной строке или в ответе Archemar. Однако из-за ваших требований я бы посоветовал использовать python. Я протестировал этот скрипт на python 3.5 и должен решить проблему или, по крайней мере, дать вам хороший старт:

import os,re,argparse
import csv

parser = argparse.ArgumentParser(description='join csvs with rows of the \
        form \w+,[1-9], inserting a zero for a row label if it does not \
        exist.')
parser.add_argument('infiles', type=str, help='infile names', nargs='+')
args = parser.parse_args()

d = {}
file_idx = 0
for infile in args.infiles:
    with open(infile, 'r') as f:
        for line in f:
            parsed_line = re.match('(\w+),([0-9]+)', line)
            if not parsed_line:
                print("line {} not parsed in file {}".format(line, infile))
                continue
            if parsed_line.group(1) in d:
                d[parsed_line.group(1)].append(parsed_line.group(2))
            else:
                l = [0]*(file_idx)
                l.append(parsed_line.group(2))
                d[parsed_line.group(1)]=l
        for k in d:
            if (len(d[k]) == file_idx):
                d[k].append(0)
            if not(len(d[k]) == file_idx+1):
                print("problem with file {}, dict {}, key {}".format(f,d,k))
    file_idx = file_idx + 1

## output time
with open('results.csv','w') as csvfile:
    cwriter = csv.writer(csvfile)
    header = [os.path.splitext(x)[0] for x in args.infiles]
    header.insert(0,'Taxa')
    cwriter.writerow(header)
    for k in sorted(d.keys()):
        d[k].insert(0,k)
        cwriter.writerow(d[k])

0
10.03.2020, 09:49
2 ответа

Предположение:$SURNAME— это имя пользователя

Чтобы записать содержимое $TITTLE, $SURNAMEи $IDв файл, названный в честь содержимого $SURNAME, вы можете изменить свой код следующим образом:

...
    else
    echo "Thank you $TITTLE $SURNAME, your information will be stored in \"$SURNAME.txt\""
    echo -e "$TITTLE\n$SURNAME\n$ID" > "$SURNAME.txt"
    break
...

, посредством чего -e позволяет эху распознавать \nкак 'новую строку'.

0
28.04.2021, 23:20

Как я писал в своем ответе на связанный вопрос «Скрипт, который проверяет 3 входа », вывод скрипта может быть перенаправлен с помощью

$./script.sh >"$USER.txt"

где $USERбудет заменено вашим именем пользователя (эта переменная, как и $LOGNAME, обычно устанавливается в ваше имя пользователя оболочкой или системой ).

Если вы хотите использовать прочитанную скриптом фамилию, то измените строку

echo "Thank you" $TITTLE $SURNAME          

в

echo "Thank you $TITTLE $SURNAME" >"$SURNAME.txt"

Это приведет к перенаправлению результата echoв файл, чье имя дается тем, что пользователь ввел для фамилии, с добавлением .txtв конец имени файла (это необязательно, очевидно ). Обратите внимание, что не выполняется проверка того, перезаписывает ли это существующий файл.

Чтобы также вывести это на терминал, продублируйте данные с помощьюtee:

echo "Thank you $TITTLE $SURNAME" | tee "$SURNAME.txt"

Чтобы вывести все три бита данных в файл, используйте, например,

{
    printf 'ID = %s\n' "$ID"
    printf 'surname = %s\n' "$SURNAME"
    printf 'title = %s\s' "$TITTLE"
} >"$SURNAME.txt"

Такое группирование набора команд внутри фигурных скобок позволяет перенаправлять весь вывод из группы за одно перенаправление.

См. " Почему printf лучше, чем echo? ", почему я предпочитаю использовать printf, а не echoпри печати переменных строк.

0
28.04.2021, 23:20

Теги

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