2015-05-05 3 views
0

Ниже приведен пример данных, которые я имею в ряд example.tsv:Split файл, используя AWK по шаблону

somedata1:data1#||#somedata2:data2#||#somedata1:data3#||#somedata2:data4

Я хотел сделать две вещи:

  1. Разделите данные из шаблона '#||#' и напишите его в другой файл. Число столбцов после расщепления не фиксировано. Я попробовал команду AWK:

    awk -F"#\|\|#" '{print;}' example.tsv > splitted.tsv

    Выход первого файла должен быть:

    column 1 somedata1:data1 somedata2:data2 somedata1:data3 somedata2:data4

  2. Далее я хочу разделить данные в splitted.tsv на основе " : '.

    somedata1 data1 data3 И напишите его в файл. Есть ли способ, которым мы могли бы сделать это в одной команде awk?

+0

Пожалуйста [править] Ваш вопрос и показать нам свой желаемый результат, я не очень понимаю, что вам нужно здесь. Нужен ли первый файл? Должен ли результат второго разделения также находиться в отдельных файлах или распечатываться на терминале? – terdon

+0

Спасибо за редактирование. Также покажите желаемый результат второго разделения. Кроме того, пожалуйста, проясните, нужны ли они для печати, чтобы разделить файлы или только стандартный вывод. – terdon

ответ

4

Необходимо правильно устранить |. Затем используйте split

awk -F'#\\|\\|#' '{split($2,a,":");print a[2]}' file 
data2 

Чтобы распечатать все данные в таблице:

awk -F'#\\|\\|#' '{for (i=1;i<=NF;i++) print $i}' file 
somedata:data1 
somedata:data2 
somedata:data3 
somedata:data1 

Чтобы разделить данные еще больше:

awk -F'#\\|\\|#' '{for (i=1;i<=NF;i++) {split($i,a,":");print a[1],a[2]}}' file 
somedata data1 
somedata data2 
somedata data3 
somedata data1 
+0

данные файла2 есть? И вы могли бы объяснить и $ 2, и тоже. Благодарю. – Vaulstein

+0

Для меня это не работает, если я не поставил три '' '. 'awk -F" # \\\ | \\\ | # "...' – jas

+0

@jas Если для разделителя полей требуется одиночное или двойное цитирование, вам нужно другое число косой черты «\». – Jotne

0

Для первого раскола, вы можете попробовать

$ awk 'BEGIN{print "column1"}{gsub(/#\|\|#/,"\n"); print }' file 
column1 
somedata:data1 
somedata:data2 
somedata:data3 
somedata:data1 

К тому времени Раскол на :, вы могли бы сделать:

$ awk -F: 'BEGIN{print "column1","column2"} 
       {gsub(/#\|\|#/,"\n"); gsub(/:/," ");print }' file 
column1 column2 
somedata data1 
somedata data2 
somedata data3 
somedata data1 
+1

@EdMorton достаточно, спасибо. – terdon

+0

@EdMorton Я думаю, вы указываете, что это позволит избежать накладных расходов на преобразование строки в регулярное выражение? В любом случае. – terdon

+0

Моя точка зрения в том, что это правильный синтаксис. Это не должно быть сознательным решением использовать разделители регулярных выражений вокруг регулярного выражения, оно должно принять осознанное решение после некоторого рассмотрения НЕ, потому что в этот момент вам нужно какое-то определенное необычное поведение. Это похоже на то, что вы всегда должны указывать переменные оболочки, потому что это правильная вещь, чтобы сделать UNLESS у вас есть что-то конкретное, чего вы хотите достичь, не делая этого и не понимая оговорки/gotchas. В обоих случаях, всегда используя правильный синтаксис, в качестве преимущества вы всегда получаете самое простое, интуитивное поведение. –

Смежные вопросы