Как объединить дополнительное поле с вводимым текстом - PullRequest
0 голосов
/ 24 декабря 2010

Вводимый текст будет:

9842901121
9942501133
9942501199
9942501133
9842901121

Сначала входной файл должен быть отсортирован только по уникальным строкам. Тогда на выходе будет

'9842901121',()(now,
'9942501133',()(now,
'9942501199',()(now,

Если мы используем ' (одинарную кавычку) в командной строке Unix, приглашение переходит на > Зачем? Как мы можем избежать этой проблемы?

Ответы [ 2 ]

0 голосов
/ 24 декабря 2010

Используйте sort и sed:

sort -u input.file | sed "s/.*/'&',()(now,/"

Что, надо сказать, довольно странная строка для объединения в конец чего-либо.

Причинаприглашение оболочки меняется на '>', так как думает, что вы не выполнили команду.Он называется вторичным приглашением и устанавливается через переменную $ PS2.Например, если я набрал:

$ sort -u input.file |
> sed "s/.*/'&',()(now,/"
'9842901121',()(now,
'9942501133',()(now,
'9942501199',()(now,
$

Когда я нажимаю клавишу возврата после символа канала, оболочка знает, что команда не завершена, поэтому она запрашивает оставшуюся часть ввода - в этом случае команду sed.

Я использовал кавычки - на этот раз двойные кавычки - вокруг сценария sed, чтобы сообщить оболочке, где заканчивается аргумент.Без них я получаю синтаксическую ошибку, но вполне возможно, что оболочка будет неправильно понимать вещи и думать, что команда была неполной.Я обычно использую одинарные кавычки вокруг строк регулярных выражений;в целом меньше поводов для беспокойства.Но на этот раз замещающий текст содержал одинарные кавычки, а затем использование одинарных кавычек вокруг всей строки требует:

sort -u input.file | sed 's/.*/'\''&'\'',()(now,/'

, что намного сложнее писать и читать, чем версия в двойных кавычках.


Из комментариев:

cat inputfile.txt | sort | uniq > Inputfile.txt
awk -F" " ' {print (echo ""$1" ,()(now,")}' Inputfile1.txt

В приведенной выше команде я не могу добавить ' до и после числа, но другие работают нормально.

  1. Пожалуйста, не злоупотребляйте cat.
  2. Пожалуйста, помните, что sort -u быстрее sort | uniq.
  3. К вашему сведению: в файловой системе нечувствительны к региструworld.
  4. Возможно, у вас есть опечатка для Inputfile1.txt.
  5. Если вам не нужен промежуточный файл, просто перенаправьте вывод из фазы сортировки в фазу 'mangle'.
  6. Как я уже отмечал в моем основном ответе, вы должны быть очень осторожны с кавычками, особенно когда вы хотите их напечатать.
  7. Опция -F для awk необходима только при наличии нескольких полейна линии и разделитель не является «пустым пространством» (пробелы или таbs).

Использование awk вместо sed вполне возможно;нам просто нужно быть осторожным с цитатами.Проблема в том, что сам скрипт awk должен включать как одинарные, так и двойные кавычки, а это значит, что вы должны быть очень осторожны.Я рекомендую использовать sed, потому что вам не нужно вводить в скрипт одинарные и двойные кавычки.

sort -u inputfile.txt |
awk '{printf "'\''%s'\'',()(now,\n", $0}'

Первая одинарная кавычка начинает строку в одинарных кавычках;в строке в одинарных кавычках нет специальных символов, и первая следующая одинарная кавычка завершает ее.Итак, первая двойная кавычка - просто обычный символ.Вторая одиночная кавычка - это начало запоминающейся последовательности: '\''.Первая из этих одинарных кавычек завершает текущую строку в одинарных кавычках;одиночная кавычка с обратной косой чертой встраивает в строку одинарную кавычку;третья одинарная кавычка в последовательности начинает новую строку в одинарных кавычках.После этого «% s» является частью строки, затем есть еще одна из '\'' последовательностей, чтобы вставить еще одну одинарную кавычку в скрипт;затем остальная часть строки формата printf(), за которой следует заключительная одинарная кавычка.Заключая вещи в одинарные кавычки, нам не нужно беспокоиться о экранировании двойных кавычек, обратных кавычек, обратной косой черты и знаков доллара в строке.В результате awk видит текст программы:

{printf "'%s',()(now,\n", $0}

, который печатает входные данные с одинарными кавычками и последовательностью ',()(now,' после нее, заканчивая новой строкой.

Можете ли вы написать это с двойными кавычками вокруг программы?Да, конечно, вы можете:

sort -u inputfile.txt |
awk "{printf \"'%s',()(now,\\n\", \$0}"

На самом деле это на два символа короче, чем в одиночной кавычке, но было больше возможностей ошибиться.С одиночными кавычками все, что мне нужно сделать, это заменить каждую одиночную кавычку, которая должна появиться в скрипте, на последовательность '\'';с двойными кавычками я должен беспокоиться о экранировании других специальных символов.

Хорошее понимание одинарных и двойных кавычек очень и очень важно для программирования оболочки. То же самое можно сказать и о том, какие части скрипта связаны с тем, что видит оболочка, а какие - с тем, что видит команда (awk в этом примере, или sed, или perl, или ...).

0 голосов
/ 24 декабря 2010

Используйте такой скрипт:

#!/bin/sh

sort "$1" | uniq | (
    while read line; do
        echo "'$line',()(now,"
    done
)

Сохраните его в файле, скажем, test.sh, а затем запустите его как sh test.sh filetoprocess.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...