Используя 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 (Разделитель полей, с пробелами по умолчанию).

Другие вопросы по тегам