Как подкачать столбцы в таком файле?

hvc0 консоль гипервизора Xen. Администратор хоста Xen входящий в Вашу виртуальную машину?

7
14.02.2012, 09:41
6 ответов

Это может быть, покончили awk использование " как разделитель полей. Но делая это, необходимо помнить это $1 пусто, $2 содержит первую строку, $3 пространство между строками, $4 вторая строка, и т.д. Кроме того, это более надежно для свопинга двух строк вместо того, чтобы просто печатать все поля и надеяться, что Вы помещаете достаточно $ns. Принимая во внимание их, следующее должно работать:

awk 'BEGIN{OFS=FS="\""} {tmp=$4;$4=$6;$6=tmp;print}' input_file >output_file
10
27.01.2020, 20:16
  • 1
    +1 для такого изящного использования awk. –  Stephen Quan 14.02.2012, 05:23

Я пошел бы с:

sed 's/"\(.*\)"/\1/' |
    awk 'BEGIN{FS="\" +\"";OFS="\" \""}{t=$3;$3=$2;$2=t;print}' |
    sed 's/.*/"&"/'

Два sed сценарии обрабатывают продвижение и запаздывающие двойные кавычки (так как они не разделители и вмешиваются). BEGIN пункт обрабатывает разделение полей. t=$3;$3=$2;$2=t стандартная полевая идиома подкачки, затем целое поле печатается (с OFS как разделитель полей).

1
27.01.2020, 20:16
  • 1
    это не работает. Я отправляю однострочный файл, и он печатает тот же файл. –  user11498 13.02.2012, 23:49
  • 2
    Используя Ваш вход ("Video or movie" "parent" "Media or entertainment" "1" "1" "1" "0" "0") и копируя вышеупомянутое (не использующий мои предыдущие воплощения), я добираюсь "Video or movie" "Media or entertainment" "parent" "1" "1" "1" "0" "0". –  Arcege 14.02.2012, 00:26

Здесь идет быстрое и грязное sed это делает это:

sed -e 's/^\("[^"]*"\) *\("[^"]*"\) *\("[^"]*"\)/\1 \3 \2/'

Но перестанет работать для полей с двойными кавычками в их значениях, и т.д.

Пример:

echo \"a\" \"b\" \"c d d d\" \"e\" | sed -e 's/^\("[^"]*"\) *\("[^"]*"\)  *\("[^"]*"\)/\1 \3 \2/'

Но я вполне уверен, кто-то сможет показать Вам awk острота, которая более проста и лучше.

1
27.01.2020, 20:16
  • 1
    это не работало на эту строку: "надоевший основной" "мелодии" "основной график" "1" "1" "1" "0" "1.0" "0" "0" –  user11498 13.02.2012, 22:49
  • 2
    @frankmoss, мне '"надоедают основного" "основной график" "мелодия" "1"', то, что не, что Вы хотите? Что Вы получаете? –  Kevin 13.02.2012, 23:02
  • 3
    Это могла бы быть пробельная проблема, попытаться измениться '*' на [ \t]*. –  Kevin 13.02.2012, 23:03
  • 4
    @Kevin я получаю исходную строку. Я заменил [\t] *, но никакое изменение в результате. Как Ваш sed смотрит? –  user11498 13.02.2012, 23:16
  • 5
    @frankmoss я вставил echo '"bored of the main" "melody" "main plot" "1"' | sed -e 's/^\("[^"]*"\) *\("[^"]*"\) *\("[^"]*"\)/\1 \3 \2/', и вынутый "bored of the main" "main plot" "melody" "1" - скопированный и вставляемый, никакие опечатки в также. GNU sed версия 4.2.1 –  Kevin 13.02.2012, 23:23

Этот метод эффективно идентичен Kevin awk метод.. Я имею, включают его здесь как сравнение между ударом и awk.

IFS=\";   # IFS sets up the split-at array delimiter
cat file |
while IFS= read -r line ;do              # Disable IFS for each `read' 
    A=($line)                            # split into array elements
    t="${A[5]}";A[5]="${A[3]}";A[3]="$t" # swap "columns" 2 and 3
    for ((i=1;i<$((${#A[@]}));i++)) ;do
       printf '"%s' "${A[$i]}"           # print each element with a lead "
    done; echo '"'                       # add the final "
done
1
27.01.2020, 20:16

Что относительно чего-то вроде этого:

awk '{print $1, $3, $2, $4, $5, $6, $7, $8}' file > newfile
0
27.01.2020, 20:16
  • 1
    @ramonovsky awk не любит комбинации кавычек и располагает с интервалами..., т.е. это не работает –  user11498 13.02.2012, 23:25
  • 2
    Можно указать, '' как-F (разделитель полей) –  ramonovski 13.02.2012, 23:28
  • 3
    И что делает -F' ' do? The problem is that this will print (e.g. in the first case) "Видеофильм" или "родитель"... ', вполне ясно не, что откровенный хочет. –  Kevin 14.02.2012, 00:32

У меня есть два решения.

ОТВЕТЬТЕ НА ТОТ: использовать sed 3 раза сделать следующее:

  1. запустите с исходной строки: 12345678
  2. копируйте первые два параметра: 1212345678
  3. прервите 4-й параметр: 121345678
  4. прервите 1-й параметр: 21345678

Вот результирующее использование команды sed (Используя XXX и YYY как помощники, чтобы найти и удалить 1-е и 4-е параметры):

sed 's/["][^"]*["][^"]*["][^"]*["]/XXX& & YYY/' data.txt | sed 's/["][^"]*["] YYY//' | sed 's/XXX["][^"]*["]//'

ОТВЕТ ДВА: Преобразуйте данные в сценарий и выполните их!

  • преобразуйте data.txt в data.sh путем вставки команды (скажите что flipcol.sh),
  • выполните data.sh

Реализуйте flipcol.sh как:

echo '"'$2'"' '"'$1'"' '"'$3'"' '"'$4'"' '"'$5'"' '"'$6'"' '"'$7'"' '"'$8'"'

Затем выполните следующую команду на своем data.txt, создающем сценарий оболочки:

sed 's!^!./flipcol.sh !' < data.txt > data.sh

Затем выполните недавно созданный сценарий оболочки

./data.sh
0
27.01.2020, 20:16

Теги

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