hvc0
консоль гипервизора Xen. Администратор хоста Xen входящий в Вашу виртуальную машину?
Это может быть, покончили awk
использование "
как разделитель полей. Но делая это, необходимо помнить это $1
пусто, $2
содержит первую строку, $3
пространство между строками, $4
вторая строка, и т.д. Кроме того, это более надежно для свопинга двух строк вместо того, чтобы просто печатать все поля и надеяться, что Вы помещаете достаточно $n
s. Принимая во внимание их, следующее должно работать:
awk 'BEGIN{OFS=FS="\""} {tmp=$4;$4=$6;$6=tmp;print}' input_file >output_file
Я пошел бы с:
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 как разделитель полей).
"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
острота, которая более проста и лучше.
[ \t]*
.
– Kevin
13.02.2012, 23:03
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
Что относительно чего-то вроде этого:
awk '{print $1, $3, $2, $4, $5, $6, $7, $8}' file > newfile
-F' ' do? The problem is that this will print (e.g. in the first case)
"Видеофильм" или "родитель"... ', вполне ясно не, что откровенный хочет.
– Kevin
14.02.2012, 00:32
У меня есть два решения.
ОТВЕТЬТЕ НА ТОТ: использовать sed
3 раза сделать следующее:
Вот результирующее использование команды sed
(Используя XXX и YYY как помощники, чтобы найти и удалить 1-е и 4-е параметры):
sed 's/["][^"]*["][^"]*["][^"]*["]/XXX& & YYY/' data.txt | sed 's/["][^"]*["] YYY//' | sed 's/XXX["][^"]*["]//'
ОТВЕТ ДВА: Преобразуйте данные в сценарий и выполните их!
Реализуйте flipcol.sh как:
echo '"'$2'"' '"'$1'"' '"'$3'"' '"'$4'"' '"'$5'"' '"'$6'"' '"'$7'"' '"'$8'"'
Затем выполните следующую команду на своем data.txt, создающем сценарий оболочки:
sed 's!^!./flipcol.sh !' < data.txt > data.sh
Затем выполните недавно созданный сценарий оболочки
./data.sh
awk
. – Stephen Quan 14.02.2012, 05:23