2012-04-22 10 views
0

У меня есть файл:AWK - как улучшить этот пример?

AA 
BB 

Эта команда выводит:

$ awk 'BEGIN { system("awk '"'"'{print}'"'"' file") }' 

AA 
BB 

То же самое, но в 'Printf':

$ awk 'BEGIN { system("awk '"'"'{printf "%s ", $0}'"'"' file") }' 

/bin/sh: Illegal option -, 

Как улучшить последнюю команду получить результат:

Благодарим за помощь.

ответ

1

Это может сработать для вас:

awk 'BEGIN{system("awk '\''{printf \"%s \", $0} END { print \"\" }'\'' file")}' 
AA BB 

или более легко :

awk 'BEGIN{system("paste -sd\" \" file")}' 
AA BB 
+0

Спасибо за хорошее решение. – Tedee12345

0

Простой, не использовать awk; использование tr.

tr '\n' ' ' file; echo; 

Или, если вам нужно все, что в одном трубопроводе

tr '\n' ' ' file | awk 'END { print }' 
+0

Это спасибо, но это идет о чем-то меня. Я хочу использовать эту команду так: 'awk 'BEGIN {system (" awk' "'' '{printf"% s ", $ 0} END {print" "}'" '"' file")} '' – Tedee12345

+0

@ Tedee12345 Почему вы хотите сделать всю эту бессмысленную системную бессмыслицу? – Dave

+0

Я хочу использовать system() по двум причинам. 1. Для обучения. 2. Я хочу использовать system() в моей функции. – Tedee12345

0

Если вы хотите сделать это чисто в AWK вы могли бы попробовать что-то вроде этого:

awk '{printf "%s ", $0} END { print "" }' < aabb.txt 
+0

Спасибо, но это касается чего-то другого. Я хочу использовать эту команду так: 'awk 'BEGIN {system (" awk' "'' '{printf"% s ", $ 0} END {print" "}'" '"' file")} '' – Tedee12345

2

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

Вместо того, чтобы пытаться использовать сложные последовательности открытых и закрытых одиночных и двойных кавычек, которые могут иметь нечетные побочные эффекты, если они не спарены правильно, вы можете использовать переменные для представления кавычек. Имея, по сути, цитирование третьего уровня, он делает код более легким для чтения. Техника, приведенная ниже, несколько аналогична цитированию Perl's q().

Установить переменную q восьмиричного эквивалента одной цитаты, то вы можете сделать это:

awk 'BEGIN{q = "\047"; system("awk " q "{print}" q " file")}' 

Расстояния до вас - каждый сегмент строки объединяются с его соседними сегментами.

Это еще один способ, которым вы могли бы найти более читаемым:

awk 'BEGIN{q = "\047"; system("awk " q"{print}"q " file")}' 
+0

Я спрашиваю о решении только из любопытства. Я знаю, что есть лучшие способы решения этой проблемы. Благодарим вас за информацию. – Tedee12345