2017-02-13 4 views
0

У меня есть куча строк, которые выглядят как:Переместить слово в другую колонку в нескольких строках

some_command -arg1 -arg2 ITEM -arg3 

мне нужно двигаться ITEM сразу после some_command

файла не имеет комментарии и т.д. Таким образом, Мне нужно выполнить описанную выше операцию только в строках, начинающихся с some_command.

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

Я думаю, awk будет моим другом здесь. Положение ITEM исправлено, поэтому я знаю номер столбца. Но как я могу сообщить awk для печати $1, затем $6, а затем все остальные столбцы от $2 до $NF, кроме $6? А также делать это только на линиях, начинающихся с some_command?

+1

'AWK«/^some_command/{$ 1 = $ 1 "" $ 4; $ 4 = ""; } 1'' –

+0

@WilliamPursell: Спасибо за хороший код, IMHO делает $ 4, поскольку NULL может вызвать проблему с интервалом, хотя и не проверял его вообще. – RavinderSingh13

+0

@WilliamPursell я вижу, что вы там делали! умный парень! отлично работает .. RavinderSingh13 вы правы, он добавляет дополнительное пространство; но это не проблема для меня .. – shikhanshu

ответ

1

@shikhanshu: Попытка:

awk '/some_command/{$2="ITEM" FS $2;sub(/.*/,"",$(NF-1))} 1' Input_file 

ИЛИ

awk '/some_command/{$2=$(NF-1) FS $2;sub(/.*/,"",$(NF-1))} 1' Input_file 
+0

Спасибо! Это тоже работает. Любое преимущество замены '/.*/' на '' '' вместо того, чтобы просто устанавливать '$ (NF-1)' на '" "'? – shikhanshu

+1

@shikhanshu: вы правы, как я уже упоминал, прежде чем он будет держать пространство таким же и не испортить их. Кроме того, $ (NF-1) позволяет нам скорректировать значение любого поля, поэтому каждый раз пусть количество полей будет чем угодно, если вам нужно всегда второе второе поле, оно должно тогда лететь. Я надеюсь, это поможет вам. Продолжайте учиться и продолжайте спрашивать/делиться :) – RavinderSingh13

+0

Предполагая, что нет комментариев * some_command * lines – NeronLeVelu

0

СЕПГ версия

sed -e '/^[[:blank:]]*#/b' -e 's/\(some_command\)\(.*\)[[:blank:]]\([^-][^[:blank:]]\{1,\}\)/\1 \3\2/' YourFile 

Если предположить, что элемент не начинается с - как в yuour образце (проще), если не пространство является разделителем и требуется немного больше кода

AWK версия

awk '/^[[:blank:]]*some_command/ {t=$4; $4=$3; $3=$2; $2=t}7' YourFile