![]() |
AWK (shell, Linux)
Вопрос такой возник по awk-у, может есть простые решения.
Есть файл формата: поле1 "поле 2" поле3 поле1 "поле 2" поле3 .... и т.д. Естественно, строковое поле "поле 3" разбивается на два. В итоге имеем $1 = поле1 $2 = "поле $3 = 2" $4 = поле3 А хотелось бы: $1 = поле1 $2 = "поле 2" $3 = поле3 Заниматься тем, что самому парсить $0 и вытаскивать отдельно значения в кавычках не улыбает, тем более, что пробел между кавычек может быть не один (или вообще табулятор). Есть ли более простые решения при помощи изменения, к примеру, FS или как-то еще? ps: к man awk не отсылать. Не нашел я там ничего по этому поводу. =) pps: интересуют решения только для awk. |
cat testfile |awk 'BEGIN {FS="\""}; {print $1, $2, $3}'
и все-таки man awk :) |
Цитата:
поле1 "поле 2" "поле 3" |
это не "немного другая", это совсем другая.
а в следующий раз что будет, бинарный файл? :) |
Цитата:
|
ты лучше файл выложи, а то мало ли, чего там еще ты забыл :)
|
Цитата:
Так что может верить на слово, строки файла аля: число число "какой-то текст" "еще какой-то текст" число число.... |
ну я ж говорил :) у тебя все вперемешку идет, что ли? выше ты нарисовал так, как будто у тебя строго три поля в строке.
и что это у тебя за работа, на которую удаленно зайти нельзя? |
Цитата:
|
так ты можешь хотя бы кусок реального файла показать? ну или сочинить, но чтобы он был таким же, как в реале. издеваться над $0 смысла нет, не для этого awk придуман.
|
Цитата:
1001 "Через тернии к звездам" "Афтар А.Ф." 1955 500 "Лениздат. бла бла бла" |
одной строки мало :) еще парочку, а лучше чуть больше. в реальном файле числа и строки идут именно в таком порядке?
|
Цитата:
Цитата:
|
т.е.
Цитата:
|
Цитата:
|
а ограничение awk only насколько критично? sed использовать можно? он есть везде, где есть shell :)
|
Цитата:
|
cat testfile |sed 's/" "/"/g'|awk 'BEGIN {FS="\""}; {print $1,$2,$3,$4,$5}'
|
Цитата:
|
не, если файл именно в таком виде, то тогда четвертое поле будет содержать "1955 500", а это неправильно. полей должно быть шесть и четвертое должно быть "1955", а пятое "500". ща переделаю, но решение станет еще сильнее привязанным к файлу :)
|
Я так понимаю, ты пробелкавычка заменил на просто кавычка и вместо текст" "текст должно получиться текст""текст и оно уже нормально разделяется через awk?
|
bash$ cat testfile |sed 's/" "/"/g'|awk 'BEGIN {FS="\""}; {split ($4,a," ")};{print $1,$2,$3,a[1],a[2],$5};'
я заменил кавычкапробелкавычка на просто кавычка и вместо текст" "текст получится текст"текст. разделяется нормально, потому что в FS сказано делить по кавычкам. но нужно еще 1955 500 разделить по пробелу, я это сразу не учел, но вышеприведенный код работает как надо. см: Цитата:
Цитата:
Цитата:
|
Цитата:
|
не за что :)
sed прост и в 99% случаев достаточно только одной его команды - s. awk намного более могуч :) и в принципе они вполне взаимозаменяемы, хотя простые вещи вроде замены с использованием регулярных выражений на sed записываются короче, из-за этого я его и пользую :) если ты с файлом все же напутал - отпишись, я подправлю скриптик. если сам не сможешь, конечно :) |
Цитата:
/me читает man sed Так много интересного. =) |
Текущее время: 23:41. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions, Inc. Перевод: zCarot