2012-06-25 2 views
0

Следующий оператор awk работает должным образом. Он возвращает 1, 2 и 4 столбца из текстового файла, ограниченного |Возврат в середине текстовой строки

awk '{print $1,"|", $2,"|", $(NF-3), "|",$(NF-2), "|", $(NF-1),"|", $(NF)}' 

Я хотел бы вернуть средние столбцы между ними. Другими словами, мне нужно заменить $ something из следующей строки на то, что будет работать.

awk '{print $1, $2, $something, $(NF-3), $(NF-2) $(NF-1), $(NF)}' 

Может быть от 3 до 11 колонок, которые заменят что-то переменное.

+0

К сожалению не получил. Что не так с 'awk '{print $ 1, $ 2, $ 3, $ (NF-3), $ (NF-2) $ (NF-1), $ (NF)}' 'ИЛИ' awk' {print $ 1, $ 2 , $ 4, $ (NF-3), $ (NF-2) $ (NF-1), $ (NF)} ''? – anubhava

+0

Мне нужно разбить файл с | разделитель в 7 столбцах. – shantanuo

+0

Вы можете использовать: '' {printf ("% s |% s |% s |% s |% s |% s |% s |% s \ n", $ 1, $ 2, $ 3, $ (NF-3) , $ (NF-2) $ (NF-1), $ (NF);} '' – anubhava

ответ

1

Я думаю, что понял, что вы ожидаете от своего вывода. Попробуйте эту линию awk: вход

awk 'BEGIN { OFS="|" } { for (i=1; i<=NF; i++) if (i <= 3 || i >= NF - 3) printf "%s"OFS, $i; else printf "%s", $i; print "" }' file.txt 

Тест: выход

1 2 3 4 5 6 7 8 9 10 11 12 13 14 
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 
Y1 Y2 Y3 Y4 Y5 Y6 Y7 Y8 Y9 Y10 Y11 Y12 Y13 Y14 
101 102 103 104 1010 1011 1012 1013 1014 

Тест:

1|2|3|4567891011|12|13|14 
X1|X2|X3|X4X5X6X7X8X9X10X11|X12|X13|X14 
Y1|Y2|Y3|Y4Y5Y6Y7Y8Y9Y10Y11|Y12|Y13|Y14 
101|102|103|10410101011|1012|1013|1014 

НТН

+0

Очень близко # тестовый ввод разделяется пробелом, а не | разделенный # тестовый выход может иметь место в четвертом столбце. – shantanuo

+0

@shantanuo, пожалуйста, обратите внимание на отправку некоторых данных образца. Где вы ожидаете пространства в четвертой колонке? – Steve

+0

Вместо длинной последовательности альтернатив: 'if (i <= 3 || i > = NF - 3)' –

Смежные вопросы