Объединить две строки файла

#shell #awk

Вопрос:

У меня есть входной файл, содержащий большие данные в приведенном ниже шаблоне. некоторая часть данных показана ниже:

 Data1  C In; CP In; D In; Q Out; Data2  CP In; D In; Q Out; Data3  CP In; CPN In; D In; QN Out;   

Я хочу, чтобы мой результат был таким

 Data1(C,CP,D,Q) In C; In CP; In D; Out Q; Data2 (CP,D,Q) In CP; In D; Out Q; Data3 (CP,CPN,D,QN) In CP; In CPN In D Out QN;  

Я попробовал код, приведенный в разделе комментариев ниже, но получил ошибку. Исправления приветствуются.

Комментарии:

1. Привет, Неха, я видел в ответе @Cyrus, сэр, что вы прокомментировали, что теперь вам нужно решение на Python. Извините, но переполнение стека работает НЕ так. OP(оригинальный плакат) задает вопрос своими усилиями на определенном языке, чтобы получить рекомендации, и задавать вопросы по вашему самому первому вопросу ВООБЩЕ НЕ рекомендуется, для отдельного вопроса, пожалуйста, открывайте отдельные сообщения. Один вопрос только за один пост, пожалуйста.

2. Также постарайтесь, чтобы пользователи знали о своих ответах, как они были, работали они или не работали, потому что люди, тратящие время на предоставление бесплатных рекомендаций, — это нечто особенное, что вы видите на этом форуме, приветствия и счастливое обучение на SO.

3. Команда в разделе I tried code явно неверный синтаксис (в ней есть несоответствующие двойные кавычки и отсутствующие одинарные кавычки), см. Ответы, которые вы получили для правильного синтаксиса. Кроме того, никогда не говорите просто But getting error или что — то подобное-всегда показывайте любое сообщение об ошибке, которое вы получаете, скопировав/вставив его в свой вопрос, как и в вашем коде.

4. Я выполнил ваш код @RavinderSingh13, но там я также получаю синтаксическую ошибку.

5. @NEHACHOUDHARY, не могли бы вы, пожалуйста, сообщить мне, как вы запускаете этот код? Я имею в виду на терминале или в сценарии?

Ответ №1:

вариация на тему предложения @EdMorton — исправление желаемого порядка полей:

 $ awk 'FNR==1{print;next}!(NR%2){a=$0; next} {printf "%s %s%s%s", $1,a,FS,ORS}' FS=';' file Data In A1; In A2; Out Z;  

Комментарии:

1. Ошибка, которую я получаю : awk: cmd. строка:1: FNR==1{печать;далее}! (NR%2){a=sh; далее} {printf %s awk: cmd. строка:1: ^ синтаксическая ошибка awk: cmd. строка:1: FNR==1{печать;далее}! (NR%2){a=sh; далее} {printf %s awk: cmd. строка:1: ^ неожиданная новая строка или конец строки . Не могли бы вы, пожалуйста, сказать, почему я становлюсь таким

Ответ №2:

 $ awk 'NR%2{print sep $0; sep=OFS; next} {printf "%s", $0}' file Data A1 In; A2 In; Z Out;  

Комментарии:

1. Здравствуйте, сэр, я пробовал это. Но я получаю синтаксическую ошибку, указывающую на «%s».

2. Тогда вы делаете что-то другое, кроме того, что я показал в своем ответе, я не знаю, что, так как я не вижу вашего терминала.

3. Ошибка, которую я получаю :- awk: cmd. line:1: NR%2{print sep tcsh; sep=OFS; next} {printf %s, tcsh} awk: cmd. line:1: ^ syntax error

4. Опять же, не видя фактической команды, которую вы выполняете, я мало что могу сделать, чтобы помочь, но то, что вы выполняете, похоже на команду в этом сообщении об ошибке, в которой отсутствуют все необходимые кавычки, но idk, если это просто потому, что это сообщение об ошибке, или потому, что вы скопировали/вставили его в комментарий, или из-за искажения уценки, или потому, что оболочка расширила переменные, или что-то еще. Почему бы просто не скопировать/вставить сценарий в мой ответ как есть и запустить его вместо того, чтобы делать то, что вы делаете?

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

Ответ №3:

Не могли бы вы, пожалуйста, попробовать следовать, написанному и протестированному с показанными образцами.

 awk ' FNR==1{  print  next } val{  sub(/;$/,OFS val"amp;")  print  val=""  next } {  val=$0 } END{  if(val!=""){  print val  } }' Input_file  

Проблемы в попытке ОП:

1-й: awk код должен быть охвачен, ' поэтому "$1=="A1" его следует изменить на '$1=="A1" .

2-й: Но условие для логики кажется мне неправильным, потому что, если мы будем искать только конкретно A1 , а In затем другие строки, такие как Z и out будут пропущены, следовательно, мы пришли к вышеуказанному подходу.

Пояснение: Добавление подробного объяснения вышеизложенного.

 awk ' ##Starting awk program from here. FNR==1{ ##Checking condition if this is first line then do following.  print ##Printing current line here.  next ##next will skip all further statements from here. } val{ ##Checking condition if val is NOT NULL then do following.  sub(/;$/,OFS val"amp;") ##Substituting last semi colon with OFS val and semi colon here.  print ##printing current line here.  val="" ##Nullify val here.  next ##next will skip all further statements from here. } {  val=$0 ##Setting current line value to val here. } END{ ##Starting END block of this program from here.  if(val!=""){ ##Checking condition if val is NOT NULL then do following.  print val ##Printing val here.  } }' Input_file ##Mentioning Input_file name here.  

Ответ №4:

и вариация на @vgersh99, но установка FS дважды: в начале и в конце.

  awk -v FS='n' -v RS= '  { gsub(";", " "); r2= $3 $2; r3= $5 $4; r4= $7 $6; } {print $1} {print r2 FS} {print r3 FS} {print r4 FS}' FS=';' file  Data In A1; In A2; Out Z; '''  Does it give you error?  

Комментарии:

1. Это сработало, если набор данных 1, если у меня много наборов данных . Как я тогда могу это сделать? Вопрос был отредактирован.

2. @НЕХА ЧОУДХАРИ Этот код не предназначен для нового набора данных, который вы опубликовали. Это только для старых данных.

3. Можете ли вы помочь мне с этими данными