#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. Можете ли вы помочь мне с этими данными