Изменение формата двух столбцов с помощью AWK

Чтобы использовать пространство из lv_root, его необходимо уменьшить. Это возможно только (без переформатирования ), если используемая файловая система поддерживает сжатие; ext3/ext4 подходят, XFS не (в этом отношении).

Соответствующий инструментlvreduce:

lvreduce -r -L -1G /dev/vg_name/lv_root

Параметры -rпредписывают использовать fsadmдля изменения размера файловой системы перед сжатием LV. Как только он завершится, у вас будет достаточно свободного места в вашей VG, чтобы расширить свой домашний LV.

5
26.01.2020, 18:47
5 ответов
$ awk -F '[,]' '{ for (i = 2; i <= NF; ++i) print $1, $i }' file
A 1
A 2
B 3
B 2
B 5
C 6
C 7
D 1
D 3
D 5
D 8

При этом строки рассматриваются как состоящие из полей, разделенных пробелами или запятыми. Для каждой строки программа awkперебирает второе поле до конца строки. Для каждого поля выводится первое поле в строке вместе с текущим полем.

8
27.01.2020, 20:32
awk '{gsub(/,/,  "\n" $1 " "); print}' file

В этом решении мы просто заменяем каждый "," на"\n$1 "

5
27.01.2020, 20:32

Если sedявляется вариантом, вы можете сделать:

sed -E ':a s/^([^ ]* )(.*),([^,]*$)/\1\2\n\1\3/; ta' infile

с учетом ввода ниже:

B 2,3,5,6
C 6,7
D 1,3,5,8
  1. Это ([^ ]* )захват первого столбца (при условии, что пробел является разделителем ); он захватитB (B , за которым следует пробел).
  2. Это (.*),фиксирует все до последней запятой; захватит2,3,5
  3. Это ([^,]*$)захватывает оставшуюся часть строки (т.е. :последнее поле после последней запятой каждый раз ); захватит6

    • поэтому \1\2\n\1\3будет выглядеть так, как показано ниже, при первом цикле -для первой строки:

      sed -E ':a s/^([^ ]* )(.*),([^,]*$)/\1\2\n\1\3/;q ;ta' infile 
      B 2,3,5
      B 6
      
    • следующий цикл -приведет к следующему результату:

      B 2,3
      B 5
      B 6
      
    • следующий запуск...
    • наконец, в последнем цикле -запуск первой строки будет выводиться, как показано ниже:

      sed -E ':a s/^([^ ]* )(.*),([^,]*$)/\1\2\n\1\3/ ;ta ;q' infile
      B 2
      B 3
      B 5
      B 6
      
    • Теперь прочитайте следующую строку и выполните тот же процесс, пока все строки не продолжатся и не закончатся.

1
27.01.2020, 20:32

Используя sedс включенным механизмом расширенных регулярных выражений, мы можем сделать, как показано:

$ sed -re '
   s/^((\S+\s+)[^,]+),/\1\n\2/
   P;D
' file

С помощью Perlмы можем сделать так, как:

$ perl -F'\s+|,' -lane '
   print join $", splice @F, 0, 2, $F[0] while @F > 1;
' file

Разделить текущую запись на пробелы или запятую и сохранить в массиве с нулевым индексом @F.

Склеить первые два элемента массива, соединить их одинарным пробелом $"и распечатать.Также одновременно замените два снятых элемента на первый. Повторяйте этот процесс, пока не останется только один элемент.

1
27.01.2020, 20:32

Я попробовал описанный ниже метод, и он сработал нормально.

Команда

for i in `awk '{print $1}' filename`; do sed -n '/'$i'/p' filename| awk -v i="$i" -F "," '{gsub(i," ",$0)}{for(j=1;j<=NF;j++)print i,$j}'; done

Выход

A   1
A   2
B   3
B   2
B   5
C   6
C   7
D   1
D   3
D   5
D   8
-1
27.01.2020, 20:32

Теги

Похожие вопросы