Существует множество способов обработки 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])
Предположение:$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
как 'новую строку'.
Как я писал в своем ответе на связанный вопрос «Скрипт, который проверяет 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
при печати переменных строк.