#shell #unix #text-processing
Вопрос:
У меня есть 10 файлов, которые содержат вертикальные данные в виде одной колонки, которые я преобразовал, чтобы объединить один файл с данными в горизонтальной форме
файл 1 :
A
B
C
B
файл 2 :
P
W
R
S
файл 3 :
E
U
C
S
аналогично, как и выше, они будут восстанавливать файлы
Я объединил все файлы, используя приведенный ниже скрипт
cd /path/
#storing all file names to array_list to club data of all into one file
array_list=`( awk -F'/' '{print $2}' )`
for i in {array_list[@]}
do
sed 's/"/""/g; s/.*/"amp;"/' /path/$i | paste -s -d, >> /path/consolidate.txt
done
Вывод, полученный из приведенного выше сценария :
"A","B","C","B"
"P","W","R","S",""
"E","U","C","S"
Почему вторая строка в качестве последней записи -> > ""
-> "P","W","R","S",""
когда их всего четыре значения в файле 2 , это должно быть : "P","W","R","S"
Происходит ли это из-за пустой строки в этом файле 2, наконец ?
Решение будет оценено по достоинству
Ответ №1:
Я предполагаю, что это действительно из пустой строки. Вы могли бы устранить такие «ошибки», обновив свой сценарий, включив sed 's/,""$//'
в него такие:
sed 's/"/""/g; s/.*/"amp;"/' /path/$i | paste -s -d, | sed 's/,""$//' >> /path/consolidate.txt
Объяснение приведенной выше команды, по частям
Замените двойную кавычку двумя двойными кавычками ( g
опция означает, что это нужно делать для каждого совпадения в каждой строке, а не только для первого совпадения).:
sed 's/"/""/g;
Мы используем точку с запятой, чтобы сообщить sed, что мы выполним другую команду. Следующая
команда замены для sed соответствует всей строке и заменяет ее самой собой,
но заключена в двойные кавычки ( amp;
представляет соответствующий шаблон).:
s/.*/"amp;"/'
Это аргумент для приведенной выше команды sed, расширяющей переменную i
в цикле
for:
/path/$i
Приведенные выше команды выдают некоторый вывод («stdout»), который по умолчанию будет
отправлен на терминал. Вместо этого мы используем его в качестве входных данных («stdin») для
последующей команды (это называется «конвейер»).:
|
Следующая команда соединяет строки «stdin», заменяя символы
,
новой строки разделителями (по умолчанию разделителем будет вкладка).:
paste -s -d,
Мы передаем «stdout» последней команды в другую команду (продолжая
конвейер).:
|
Следующая команда-это другая sed, на этот раз заменяющая любые вхождения
,""
, которые происходят в конце строки (в sed $
означает конец строки),
ничем (фактически удаляя совпадающую скороговорку):
sed 's/,""$//'
Выходные данные вышеупомянутого конвейера добавляются в наш текстовый файл ( >>
добавляется,
в то время >
как перезаписывается).:
>> /path/consolidate.txt
Комментарии:
1. Спасибо за решение можете ли вы описать всю приведенную выше команду, что на самом деле она делает, это будет полезно для всех других пользователей