почему пустая двойная кавычка появляется в файле при последней записи | оболочке |

#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. Спасибо за решение можете ли вы описать всю приведенную выше команду, что на самом деле она делает, это будет полезно для всех других пользователей