Изменение порядка столбцов с помощью awk

Для тех, кто гуглил здесь:

Наконец я разобрался, я имею в виду использование Skype для бизнеса на ubuntu.

На самом деле это плагин для Chrome под названием ARC Welder, своего рода эмулятор Android в Chrome.

Загрузите здесь: https://chrome.google.com/webstore/detail/arc-welder/emfinbmielocnlhgmfkkmkngdoccbadn?utm_source=chrome-app-launcher-info-dialog

После установки запустите его, затем просто перетащите apk скайпа для бизнеса в его окно и наслаждайтесь!

12
05.07.2016, 15:49
6 ответов

Вы, вероятно, имеете в виду:

awk -F, -v OFS='' '{print $1,$2,$3,$4,$5,$6,$8,$9,$10,$11,$7}' "$file"
3
27.01.2020, 19:54

Для параметра -F требуется аргумент: -F, , например.

Конец сценария awk должен быть разделен (пробел) с остальными параметрами.

Если разделителем полей является , и вы хотите сохранить его, и если количество столбцов постоянное и меньше или равно 11, попробуйте следующее:

awk -F, '{print $1,$2,$3,$4,$5,$6,$8,$9,$10,$11,$7}' OFS=, "$file"
14
27.01.2020, 19:54

Если вы печатаете с OFS=, то есть без разделителя между полями, вы можете просто сохранить значение $7 в переменной, установить $7 в пустоту и печатать строку и переменную напрямую. Вам не нужно указывать все поля:

$ cat file
1,2,3,4,5,6,7,8
$ awk -F, -vOFS= '{k=$7; $7=""; print $0,k}' file 
12345687
5
27.01.2020, 19:54

Вы конкретно не сказали, что хотите использовать awk, и вы действительно сказали, что хотите использовать редактирование на месте, как это предусмотрено sed -i , так что вот вариант sed -i . Обычно awk лучше подходит для работы со столбцами, но это тот случай, когда я предпочитаю sed , потому что он, естественно, обрабатывает произвольное количество столбцов.

MOVECOL=7
N=$((MOVECOL-1))
sed -r -e "s/^(([^,]*,){$N})([^,]*),(.*)/\1\4,\3/" -i test.csv

Объяснение:

  • -r выбирает расширенные регулярные выражения, поэтому мы избегаем большого количества обратных косых черт.
  • первая группа - это $ N повторений строк, завершающихся запятой, другими словами, столбцы перед тем, который мы хотим переместить, с последней запятой
  • вторая группа - это $ N-й повтор, мы забываем об этом
  • третья группа - это столбец, который мы хотим переместить, без последней запятой
  • четвертая группа состоит из всех столбцов после тот, который мы хотим переместить, без запятой перед
  • , мы заменяем его первой группой, последней группой и извлеченным столбцом, вставляя запятую по мере необходимости.

Конечно, это не будет работать с файлами, которые скрывают запятые в кавычках (или, что еще хуже, экранируют их), но awk также не справится с этим без серьезной акробатики. Если у вас есть такая проблема, вам лучше использовать perl модуль Text: CSV или python модуль csv .

3
27.01.2020, 19:54

Более коротким решением будет

awk -F',+' -v OFS=, '{$(NF+1)=$7; $7=""; $0=$0; $1=$1}1' file

Я не уверен, что ,+ будет работать во всех awk версиях, но работает по крайней мере в GNU awk, также с -compatibility mode.

Объяснение:

  • $(NF+1)=$7: сначала мы добавляем 7-е поле в конец строки (в данном случае это может быть $12=$7)
  • $7="": на следующем шаге 7-е поле стирается (но окружающие разделители остаются)
  • чтобы удалить разделители, нам нужно переустановить всю запись (через $0=$0), используя несколько запятых как разделитель полей (это делается через -F',+', здесь + означает один или несколько раз), а также переставить текущую запись через $1=$1 для принудительного восстановления строки с использованием ранее установленного разделителя выходных полей (устанавливается опцией -v OFS=,)
  • после того, как все перестановки сделаны, мы готовы распечатать результат с помощью 1

Пример ввода:

1,2,3,4,5,6,7,8,9,10,11

output

1,2,3,4,5,6,8,9,10,11,7
9
27.01.2020, 19:54

Пара вариантов awk (при условии, что ваш файл находится внутри переменной $file)

  • Здесь вы можете выполнить цикл для всех coloumn, печать с разделителем полей (OFS) и печать терминатора записи (ORS) в конце строки.

    awk -F',' -v OFS=, \
    '{for(i=1;i<=NF;i++) if (i!=7) printf "%s",$i OFS; \
    printf "%s",$7;printf ORS}' "$file"
    
  • Здесь с использованием regex и gensub() функции

    gawk -F',+' -v OFS=, '{$0=gensub(/\s*\S+/,"",7) OFS $7}1' "$file"
    

    убивая 7 поле и печатая его в конце строки.

    • $0 - вся запись
    • $n - n запись
    • NF - количество полей текущей строки
    • OFS - разделитель выходных файлов
    • NF - разделитель выходных файлов. разделитель выходных файлов
    • ORS терминатор выходной записи
    • 1 - это трюк, который нужно сказать awk true и вывести значение по умолчанию ($0).

Update...

Чуть не забыл, можно сдвинуть все столбцы, следующие за 7.

awk  -F',' -v OFS=, '{tmp=$7; for(i=7;i<=NF;i++) $i=$(i+1); $NF=tmp}1 ' "$file"
2
27.01.2020, 19:54

Теги

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