определение номера столбца с помощью строки в awk

В целом Вы не были должны. GNU coreutils и некоторые другие версии добавляют -i опция для оперативного редактирования, но это имеет переменные реализации и не портативно. Файлы не являются потоками, таким образом редактируя их с sed должен избежаться. -i опция к sed также повреждают любые символьные ссылки, так как это по существу удаляет его и воссоздает файл. Использовать ed или ex для более нормальной альтернативы.

ex -s file << EOF
s/a/o/
w
EOF
6
30.05.2015, 19:37
5 ответов

Вы можете попробовать:

$ awk -F'|' '
{
  for(i=1;i<=NF;i++) {
    if($i == "Fruits")
      printf("Column %d is Fruits\n", i-1)
    if($i == "Colors")
      printf("Column %d is Colors\n", i-1)
  }
  exit 0
}
' file
Column 2 is Fruits
Column 3 is Colors

Обратите внимание, что фактический столбец для Фруктов и Цвета составляет 3 доллара США и 4 доллара .

5
27.01.2020, 20:22

Может быть, лучше распечатать все столбцы, присутствующие в первой строке, чтобы проверить не только для этих двух полей, но и обнаружения новых столбцов, их имена, изменения заказа и т. Д.

awk -F'|' ' { for (i = 1; i <= NF; ++i) print i, $i; exit } ' file

Выход:

1
2 Sr
3 Fruits
4 Colors
5
3
27.01.2020, 20:22

Перечислите все заголовки столбцов:

awk 'BEGIN{ FS="|" }
     { for(fn=1;fn<=NF;fn++) {print fn" = "$fn;}; exit; }
    ' file

Выход:

$1 = 
$2 = Sr
$3 = Fruits
$4 = Colors
$5 = 

Используя текст этикетки, распечатайте выбранные столбцы в выбранном порядке:

awk 'BEGIN{ FS="|" }
     NR==1 { split(columns, c) 
             for(fn=1;fn<=NF;fn++) hdr[$fn]=fn; next; }
     { printf( FS ); for (text in c) printf( "%s", $hdr[c[text]]FS ); print "" }
    ' columns="Colors|Fruits" file

Выход:

|red|apple |
|orange|orange |
|purple|grapes |
2
27.01.2020, 20:22

Это кажется немного неуклюжим, но я всегда нахожу номера столбцов, используя следующую строку кода:

head -1 file | sed 's/*delimiter*/\n/g' | nl

Здесь я беру строку заголовка файла и передаю ее по конвейеру sed, заменяя разделитель на \ n. В результате заголовок каждого столбца теперь находится на новой строке. Наконец, я передаю это по каналу nl, который добавляет номера строк, соответствующие исходным номерам столбцов.

5
27.01.2020, 20:22

Другая возможность состоит в том, чтобы рассматривать разделитель полей |как разделитель записей, а затем обрабатывать первую строку.

В столбце.awk:

BEGIN {
  RS = "|" 
}
/^Fruits$|^Colors$/ {
  print $0, NR - 1
}
$ head -n1 fruits.txt | awk -f colnum.awk
Fruits 2
Colors 3
0
27.01.2020, 20:22

Теги

Похожие вопросы