2013-11-07 3 views
1

Я пытаюсь сделать что-то довольно простое, но оно кажется более сложным, чем ожидалось ... У меня есть строки в текстовом файле, разделенные запятой, и что я хочу вывод в другой файл без первого поля.Как сохранить пробелы во входных полях с awk

Вход:

echo file1,item,  12345678 | awk -F',' '{OFS = ";";$1=""; print $0}' 

Выход:

;item; 12345678 

Как вы можете видеть пробелы до 12345678 являются своего рода слились только в одном пространстве. Я также попытался с помощью команды CUT:

echo file1,item,  12345678 | cut -d, -f2- 

и я в конечном итоге с тем же результатом.

Есть ли обходной путь, чтобы справиться с этим?

На самом деле весь мой сценарий выглядит следующим образом:

cat myfile | while read l_line 
    do 
     l_line="'$l_line'" 
     v_OutputFile=$(echo $l_line | awk -F',' '{print $1}') 
     echo $(echo $l_line | cut -d, -f2-) >> ${v_OutputFile} 
    done 

Но кадры в l_line все пространства, но один удаляются. Я также создал кавычки внутри файла, но тот же результат.

ответ

1

Проблема с вашим вызовом команды echo, которую вы используете для подачи awk данных теста выше. Оболочка смотрит на эту команду:

echo file1,item,  12345678 

и лечения file1,item,12345678 и в виде двух отдельных параметров echo. echo просто печатает все его параметры, разделенные одним пространством.

Если вы процитировать пропуски, следующим образом:

echo 'file1,item,  12345678' 

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


Update после редактирования в OP - видевший свой полный сценарий, вы можете сделать это полностью в awk:

awk -F, '{ OFS = "," ; f = $1 ; sub("^[^,]*,","") ; print $0 >> f }' myfile 
+0

Спасибо за ваш ответ. Пожалуйста, см. Мой отредактированный вопрос, потому что мне все еще не удается заполнить мой код. – user2965986

+0

Спасибо - я исправил свой ответ в ответ на ваше редактирование. – pobrelkey

1

это не имеет ничего общего с AWK. укажите строку в вашем эхом:

#with quotes 
kent$ echo 'a,b,   c'|awk -F, -v OFS=";" '{$1="";print $0}' 
;b;   c 

#without quotes 
kent$ echo a,b,   c|awk -F, -v OFS=";" '{$1="";print $0}' 
;b; c 
+0

ОК, я понял. Спасибо за Ваш ответ. Однако моя строка хранится внутри переменной, поэтому не уверен, как процитировать мою строку при создании переменной. – user2965986