Создание нового столбца из определенных строк из файла? - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь решить следующую проблему, но несколько попыток не смогли ее исправить.

Предположим, у меня есть следующее в файле:

a,b,c

d,e,f

g

h

Мне нужен какой-то способдобавьте g и h в качестве третьего столбца, чтобы файл выглядел следующим образом:

a, b, c, g

d, e, f, h

Спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 24 апреля 2019

если данные в файле 'd', попробуйте на GNU AWK:

awk -F, '$0~/\S/ {if(NF>1) {m[++i]=$0} else {n[++j]=$0}} END{for(;c++<i;){print m[c]","n[c]}}' d
1 голос
/ 24 апреля 2019

Обратите внимание, что я понимаю ваш вопрос о том, как соединить строку 3 до конца строки 1, строку 4 до конца 2, а затем строку 7 до конца 5 и 8 до конца 6и т. д.

Я предполагаю, что у вас действительно есть входной файл, например:

a,b,c
d,e,f
g
h

Если ваш файл действительно с двойным интервалом, вы можете исправить это, используя:

sed '/./!d' FILE

Затем присоединить каждую вторую строку к строке 2 строки перед ней:

cat FILE | sed '/./!d' | awk '
  BEGIN {
    d[0] = ""; d[1] = ""
  }
  {
    n = NR % 2
    if (d[n] == "")
      d[n] = $0
    else {
      print d[n] "," $0
      d[n] = ""
    }
  }
  '

Я с удовольствием объясню этот код, если вы спросите.

Кроме того, есливам нужно учитывать возможность того, что файл содержит нечетное количество строк, например

a,b,c 
d,e,f
g
h
x,y,z

Добавить блок END в ваш AWK:

  END {
    if (d[1] != "") print d[1]
    if (d[0] != "") print d[0]
  }
0 голосов
/ 24 апреля 2019

Мне не совсем понятно, как обобщить ваш вопрос. (то есть, что вы хотите сделать с 8-строчным файлом?), но для конкретного случая, когда вы хотите поменять 2-ю и 3-ю строки и вставить, вы можете использовать:

perl -e 'chomp (my @ar =<>); @ar[1,2] = @ar[2, 1]; map { $_ .= ($i++%2 ? "\n" : ",")} @ar; print @ar' input

Возможно, вы можете изменить это в соответствии со своими потребностями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...