2016-06-19 5 views
0

Я пытаюсь применить простой скрипт awk к файлу набора данных. Файл имеет 150 столбцов, мне нужны столбцы от 20 до 30.извлекать конкретные столбцы из набора данных с использованием AWK

ниже сценарий я использовал, чтобы получить записи с полем от 20 до 30.

код

BEGIN{} 
{ 
for(f=20;f<=30;f++){ 
    print $f; 
    } 
} 

Я не знаю, почему я получаю значение каждого из 10 полей в следующей строке.

То есть,

образец набора данных

1 2 3 4 5 6 7 
2 2 3 4 5 6 7 
3 3 3 4 5 6 7 
4 4 4 4 5 6 7 
5 5 5 5 5 6 7 
6 6 6 6 6 6 7 
7 7 7 7 7 7 7 

I get output as 
1 
2 
3 
4 
5 
6 
7 
2 
2 
3 
4 
5 
6 
7 
...so on 
+0

* Используйте оператор печати, чтобы произвести вывод с простое, стандартизованное форматирование. Вы указываете только строки или числа для печати в списке, разделенном запятыми. Они выводятся, разделяются единичными пробелами, а затем новой строкой. * – melpomene

+1

Чтобы продлить комментарий к мельпомене, посмотрите на ['printf'] (https://www.gnu.org/software/gawk/manual/html_node/Printing. html # Printing) –

+0

Я уже пробовал использовать printf («% s», $ f), но тогда все находится в одной строке. как иметь столбец и записи как есть? Я тоже использовал OFS, FS, RS. но я не могу заставить его работать:/ –

ответ

2

Ниже еще один способ делать то же

awk -v f=20 -v t=30 '{for(i=f;i<=t;i++) \ 
        printf("%s%s",$i,(i==t)?"\n":OFS)}' file 

Примечания

  1. f и t - начальная и конечная колонны соответственно.
  2. Мы использовали тернарный оператор для управления разделителем полей между необходимыми столбцами.

Редактировать

Если вам нужны колонки 20 через 30 и последней колонке, ниже будет достаточно:

awk -v f=20 -v t=30 '{for(i=f;i<=t;i++) \ 
         printf("%s%s",$i,(i==t)?OFS""$NF"\n":OFS)}' file 
+0

Что делать, если мне требуется col 20-30 и последний col (то есть 150-й)? можете ли вы сказать, какой будет лучший подход? –

+0

@MurlidharFichadia: См. Обновление – sjsam

+0

О, вау, настоящие пески NF для общего количества полей. так что это будет последний столбец. Nice :) first% s print column 20-30, а второй% s печатает $ NF. можете ли вы объяснить OFS здесь, почему он добавляет пространство после каждого столбца, хотя в printf вы не добавили его так: «% s [пробел]% s» –

2

Решение

BEGIN{FS=" ";} 
{ 
for(f=20;f<=30;f++){ 
    printf("%s ",$f); 
    }print ""; 
} 
Смежные вопросы