Вывод формата xargs

Вы попробовали все USB-порты? Кроме того, Вы попытались смотреть в BIOS, чтобы видеть, мог ли это быть disapbled? Если это имеет USB, трудно полагать, что все порты повреждаются, хотя что-то, возможно, сдуло его в прошлом.

Тем не менее я думаю, что можно сделать это, но это могло бы быть болезненно. Это зависело бы, на какой системе Вы используете. Для моего (Ubuntu с Gnome), существует установка под "Универсальным Доступом", на вкладке "Pointing and Clicking", для "Кнопок мыши", которые позволяют Вам использовать клавиатуру.

У меня есть голова, что X-окна имеют способ использовать Ctrl-Shift-Numlock, но это ничего не делает в моей системе.

Я полагаю, что KDE имеет установку под панелью управления мыши, названной 'Указатель перемещения с клавиатурой (использующий цифровую клавиатуру)’.

10
19.04.2015, 10:43
4 ответа

Ниже приблизительно дюжина примеров того, как можно взять файл, такой как это:

$ cat k.txt
1
2
3

и преобразуйте его в этот формат:

1,2,3

Можно использовать эту команду для создания вышеупомянутого файла, если требуется манипулировать:

$ cat <<EOF > k.txt
1
2
3
EOF

Примеры ниже разделяются на 2 группы. Работают, которые "работают" и это "почти". Я оставляю их, потому что часто времена, которые столь же ценно видеть, почему что-то не работает, как это должно видеть, почему что-то делает.

Представлено большинство языков сценариев, с которыми я знаком. Некоторые представлены многократно, с тех пор как с известным акронимом, на который обычно ссылаются в Perl, TIMTOWTDI.

Примечание: Можно выгрузить запятую (,) в примерах ниже и замене это с любыми символами Вы хотите, т.е. |.

Примеры та "работа"

Эти фрагменты кода произведут желаемый вывод.

paste команда:

$ paste -s -d ',' k.txt 
1,2,3

sed команда:

$ sed ':a;N;$!ba;s/\n/,/g' k.txt
1,2,3

$ sed ':a;{N;s/\n/,/};ba' k.txt 
1,2,3

perl команда:

$ perl -00 -p -e 's/\n(?!$)/,/g' k.txt
1,2,3

$ perl -00 -p -e 'chomp;tr/\n/,/' k.txt
1,2,3

awk команда:

$ awk '{printf"%s%s",c,$0;c=","}' k.txt
1,2,3

$ awk '{printf "%s,",$0}' k.txt | awk '{sub(/\,$/,"");print}'
1,2,3

$ awk -vORS=, 1 k.txt | awk '{sub(/\,$/,"");print}'
1,2,3

$ awk 'BEGIN {RS="dn"}{gsub("\n",",");print $0}' k.txt | awk '{sub(/\,$/,"");print}'
1,2,3

python команда:

$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,3

$ python -c "import sys; print sys.stdin.read().replace('\n', ',').rstrip(',')" <k.txt
1,2,3

Bash mapfile встроенный:

$ mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
1,2,3

ruby команда:

$ ruby -00 -pe 'gsub /\n/,",";chop' < k.txt
1,2,3

$ ruby -00 -pe '$_.chomp!"\n";$_.tr!"\n",","' k.txt
1,2,3

php команда:

$ php -r 'echo strtr(chop(file_get_contents($argv[1])),"\n",",");' k.txt
1,2,3

Протесты

Большинство примеров выше будет работать просто великолепно. Некоторые скрыли проблемы, такие как пример PHP выше. Функция chop() на самом деле псевдоним к rtrim(), таким образом, конечные пробелы последней строки будут также удалены.

Так также сделайте делает первый пример Ruby и первый пример Python. Проблема с тем, как они все используют тип операции, которая по существу "прерывает" прочь, вслепую, конечный символ. Это хорошо в для примера, что OP, если, но заботу нужно соблюдать при использовании этих типов лайнеров, чтобы удостовериться, что они соответствуют данным, которые они обрабатывают.

Пример

Скажите наш файл примера, k.txt бывший похожий это вместо этого:

$ echo -en "1\n2\n3" > k.txt

Это выглядит подобным, но это имеет незначительные различия. Это не имеет запаздывающей новой строки (\n) как исходный файл. Теперь, когда мы выполняем первый пример Python, мы получаем это:

$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,

Примеры это "почти" работает

Это "всегда подружка невесты, никогда невеста" примеры. Большинство из них могло, вероятно, быть адаптировано, но при работе потенциального решения проблемы, когда это чувствует себя "принудительным", это - вероятно, неправильный инструмент для задания!

perl команда:

$ perl -p -e 's/\n/,/' k.txt
1,2,3,

tr команда:

$ tr '\n' ','  < k.txt 
1,2,3,

cat + echo команды:

$ echo $(cat k.txt)
1 2 3

ruby команда:

$ ruby -pe '$_["\n"]=","' k.txt
1,2,3,

Bash while + read созданный-ins:

$ while read line; do echo -n "$line,"; done < k.txt
1,2,3,
18
27.01.2020, 20:00
  • 1
    Относительно awk Я предпочитаю более короткую альтернативу: awk -vORS=, 1 k.txt –  manatwork 02.09.2013, 15:39
  • 2
    Не уверенный, имеет ли CentOS bash: mapfile -t a < k.txt; (IFS=','; echo "${a[*]}") –  manatwork 02.09.2013, 15:42
  • 3
    , не уверенный в запаздывающей новой строке. Согласно моему тесту Ваш perl и сначала awk имеет их также. –  manatwork 02.09.2013, 15:44
  • 4
    я поместил бы paste один наверху. Это точно что paste -s для здесь. Это - стандартная команда и было бы самым эффективным. Все другие являются излишеством и/или не являются портативными или имеют ограничения. –  Stéphane Chazelas 02.09.2013, 15:46
  • 5
    mapfile является относительно новым, включен bash 4.0. –  manatwork 02.09.2013, 15:48

@slm, уже данный хороший ответ, но как Ваш вопрос "вывод формата xargs"

xargs -I{} echo -n "{}|" < test.txt
  • -I опция "строк замены".
  • {} заполнитель для синтезируемого текста.
  • Это подобно использованию пары фигурной скобки в "находке".

Если Вы хотите избавиться от запаздывания | можно использовать sed сделать некоторую уборку:

$ xargs -I{} echo -n "{}|" < k.txt  | sed -e 's/|$//'
1|2|3
4
27.01.2020, 20:00
  • 1
    Это прикрепляет дополнительный канал на после 3. "1|2|3 |". У меня была та же проблема с некоторое время циклом и awk решением. –  slm♦ 02.09.2013, 13:38
  • 2
    да, если существует новая строка.. tr,sed и другой также.. –  Rahul Patil 02.09.2013, 13:40

Это старая нить, я знаю. OP запросил простым кодом, как это. Чтобы держать его близко к оригиналу, у меня простое решение.

cat k.txt | xargs
1 2 3

Использование SED

cat k.txt | xargs | sed 's/ /,/g'
1,2,3

или

cat k.txt | xargs | sed 's/ /|/g'
1|2|3

SED может выглядеть немного странно, но сломано, это имеет большой смысл.

для замены. G 'предназначен для Global: без этого он будет делать только первую замену на каждой новой линии. Так как вы используете «xargs», он отображает их как одна строка. Так что вы получите «1,2 3».

Разделитель используется для разделения. Я использовал / символ. Один интересный трюк: вы можете заменить разделитель с большинством любых других символов, пока мы сохраняем его тот же формат между цитатами. Так что это будет работать также ....

cat k.txt | xargs | sed 's# #,#g'

или

cat k.txt | xargs | sed 'sT T,Tg'

Очевидно, используя определенные символы, поскольку разделитель может быть запутанным, так что будьте умны.

1
27.01.2020, 20:00
xargs <k.txt | tr \  \|

Вам не нужно CAT - просто пропустите ввод файла и - если не дано никакой другой команды - xargs выйдут свой формат по умолчанию - что имеет вид с / Bin / Echo (без переоценки C-escape C-Escape) .

XARGS выложит пробел из головы / хвоста из входного файла и выжимают другие последовательности пробела до одного пространства. Это означает, что при прохождении файла из TR в xargs Как:

tr \\n \| <k.txt | xargs

... Prints ...

1|2|3|

... Проезжает Другой путь И работает только на ARGS , что xargs Space-delimits делает ....

1|2|3\n

... потому что Xargs печатает конечную тренажерную новую строку (как требуется для текстового файла) , но он не получается TR .

Обратите внимание, что это (или любое другое решение, предлагаемое здесь) , не учитывается xargs ввода. XARGS пройдет буквально одиночные / двойные / с обратной котировкой, цитируемым нежилым пробелным пространством на входе, которые сами могут быть такими:

xargs <<\IN
1    2'      3'\'      \'4
IN

1 2      3' '4
0
27.01.2020, 20:00

Теги

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