2017-01-12 1 views
-1

У меня есть файл с разделителями табуляции с n строками и m столбцами, я хочу напечатать первые три столбца и выполнить поиск шаблона и напечатать этот столбец, если он есть. Я попытался выполнить поиск и распечатать в sed, но не смог сделать это, чтобы напечатать первые 3 столбца, а затем выполнить поиск шаблона.Как напечатать первый столбец n и столбец, который соответствует шаблону?

пример у меня есть файл, как

col1 col2 col3 col4 col5 col6 
test 23  2323 32  635  36354 
test2 354  35b  345  345  555 
test4 486  g4  435  0.43 34 
test5 0.6  35  0.34 0.234 34563 

выход Я хочу есть (если шаблон я ищу это 'col6', например)

col1 col2 col3 col6 
test 23  2323 36354 
test2 354  35b  555 
test4 486  g4  34 
test5 0.6  35  34563 
+1

Пожалуйста, добавьте образец входного файла и команду sed, которую вы пробовали, чтобы дать больше информации людям, которые смотрят на вопрос. – nu11p01n73R

+0

Вы хотите напечатать n-й столбец, если заголовок соответствует шаблону? – nu11p01n73R

+0

да но номер столбца n не известен –

ответ

3

Вы можете перемещаться по полям, когда AWK читает первую строку и определить, какое поле col6 присутствует,

NR==1 { 
     for (i=1; i<=NF; i++) 
       if ($i == "col6") 
         column=i 
} 
{ 
     print $1, $2, $3, column ? $column : "" 
} 

Что он делает?

  • NR==1 Если текущее количество записей (строки) читать, 1, затем перебирать NF количества полого

    • if ($i == "col6"), если текущий столбец равен строке мы ищем, мы экономим его в переменной column.
  • print $1, $2, $3, column ? $column : "" Печать первых трех полей. Поле column печатается только в том случае, если оно установлено, если не печатает пустой "".


Пример

$ awk 'NR==1{ for (i=1; i<=NF; i++)if ($i == "col6") column=i}{print $1, $2, $3, column ? $column : ""}' file 
col1 col2 col3 col6 
test 23 2323 36354 
test2 354 35b 555 
test4 486 g4 34 
test5 0.6 35 34563 
1
cat /your/file | awk 'NR<=3 {print $0}' | grep 'your-pattern' 

напечатать первые три колонки

awk 'NR<=3 {print $0}' # if file has headers , NR<=4 

и найти образец и пр. ИНТ этот столбец, если настоящим

grep 'foo' 
+0

шаблон не в первых 3 столбцах, grep после awk не работал –

+0

Пожалуйста, прочитайте о [бесполезном использовании 'cat'] (https://stackoverflow.com/questions/11710552) , –

+0

Вы правы. я изменю его – dormi330

1

В AWK:

$ awk -v p='col6' -F'\t' ' 
NR==1 {         # on the first record 
    split($0,a,FS);      # split header to array a 
    for(i in a)       # search for index of field with p 
     if(a[i]==p) 
      c=i       # set it to c 
} 
$0=$1 OFS $2 OFS $3 (c ? OFS $c : "") # print $1-$3 and $c if it exists 
' foo 
col1 col2 col3 col6 
test 23  2323 36354 
test2 354  35b  555 
test4 486  g4  34 
test5 0.6  35  34563 

Если вы хотите вкладку вывода разделителями, а также добавить -v OFS='\t' в командной строке.

+0

Спасибо, работал отлично –