Для тех, кто гуглил здесь:
Наконец я разобрался, я имею в виду использование Skype для бизнеса на ubuntu.
На самом деле это плагин для Chrome под названием ARC Welder, своего рода эмулятор Android в Chrome.
Загрузите здесь: https://chrome.google.com/webstore/detail/arc-welder/emfinbmielocnlhgmfkkmkngdoccbadn?utm_source=chrome-app-launcher-info-dialog
После установки запустите его, затем просто перетащите apk скайпа для бизнеса в его окно и наслаждайтесь!
Вы, вероятно, имеете в виду:
awk -F, -v OFS='' '{print $1,$2,$3,$4,$5,$6,$8,$9,$10,$11,$7}' "$file"
Для параметра -F
требуется аргумент: -F,
, например.
Конец сценария awk
должен быть разделен (пробел) с остальными параметрами.
Если разделителем полей является ,
и вы хотите сохранить его, и если количество столбцов постоянное и меньше или равно 11, попробуйте следующее:
awk -F, '{print $1,$2,$3,$4,$5,$6,$8,$9,$10,$11,$7}' OFS=, "$file"
Если вы печатаете с OFS=
, то есть без разделителя между полями, вы можете просто сохранить значение $7
в переменной, установить $7
в пустоту и печатать строку и переменную напрямую. Вам не нужно указывать все поля:
$ cat file
1,2,3,4,5,6,7,8
$ awk -F, -vOFS= '{k=$7; $7=""; print $0,k}' file
12345687
Вы конкретно не сказали, что хотите использовать awk, и вы действительно сказали, что хотите использовать редактирование на месте, как это предусмотрено sed -i
, так что вот вариант sed -i
. Обычно awk
лучше подходит для работы со столбцами, но это тот случай, когда я предпочитаю sed
, потому что он, естественно, обрабатывает произвольное количество столбцов.
MOVECOL=7
N=$((MOVECOL-1))
sed -r -e "s/^(([^,]*,){$N})([^,]*),(.*)/\1\4,\3/" -i test.csv
Объяснение:
-r
выбирает расширенные регулярные выражения, поэтому мы избегаем большого количества обратных косых черт. Конечно, это не будет работать с файлами, которые скрывают запятые в кавычках (или, что еще хуже, экранируют их), но awk также не справится с этим без серьезной акробатики. Если у вас есть такая проблема, вам лучше использовать perl
модуль Text: CSV
или python
модуль csv
.
Более коротким решением будет
awk -F',+' -v OFS=, '{$(NF+1)=$7; $7=""; $0=$0; $1=$1}1' file
Я не уверен, что ,+
будет работать во всех awk
версиях, но работает по крайней мере в GNU awk, также с -c
ompatibility 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
Пара вариантов 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"