Используя awk, чтобы разбить строку, а затем собрать воедино столбцы 3-n
Я не часто пишу сценарии bash, так что прости мое невежество. У меня есть файл журнала, который я читаю построчно. В зависимости от первых 4 символов, я манипулирую строкой и переписываю в очищенный файл. В редких случаях я не знаю, сколько будет столбцов. Первоначально я использовал следующее, прежде чем понять, что в файле журнала с 20 000+ строк было более 7 столбцов:
echo $line | awk '{split($0,a," "); print a[3] " " a[4] " " a[5] " " a[6] " " a[7]}' >> $filename
… Производить продукцию, как: Hello world, I need vacation
Я нахожусь в точке, где я могу извлечь всю необходимую информацию, но она пишет в виде списка:
echo $line | awk '{split($0,a," "); for(i=3;i<=NF;i++) print a[i]}' >> $filename
... производство:
Hello
world,
I
need
vacation
Используя пост "Использование awk для печати всех столбцов от n-го до последнего" (среди прочих), я попытался добавить в микс cat, svn и другие вещи, но синтаксис мне не подходит. Мне нравится мысль о замене части awk выше:
awk '{out=""; for(i=2;i<=NF;i++){out=$out" "$i}; print $out}'
но я, видимо, не понимаю правила.
Заранее благодарю за любую помощь!
2 ответа
Как насчет cut
вместо:
echo "1 2 3 4 5" | cut -d ' ' -f 3-
Выход:
3 4 5
Кто-то написал вчера, но он был удален, прежде чем я смог вернуться, чтобы поставить галочку (спасибо, незнакомец!). Используя awk, пост сказал:
awk '{for (i = 3; i<= NF; i ++) printf "% s% s", $ i, (i == NF? RS: FS)}' <<< "$ line" >> "$ имя файла"
с объяснением: (i==NF?RS:FS) - условие тройного теста - если последнее поле, используйте RS (разделитель записей и символ новой строки, по умолчанию); иначе используйте FS (Разделитель полей, с пробелами по умолчанию).