Вывести метку заголовка в поле данных в miller

Использование однострочника perl:

perl -a -e '$line{$F[0]} = $_ if (length($_) > length($line{$F[0]})) ; END { foreach (sort keys %line) { print $line{$_} } };'  STs.csv STt.csv

Или, в более простой для чтения форме автономного скрипта Perl:

#! /usr/bin/perl -a

$line{$F[0]} = $_ if (length($_) > length($line{$F[0]})) ;

END {
  foreach (sort keys %line) { print $line{$_} }
};

По сути, это тот же алгоритм, что и Ответ Archemar, но в perl , а не в awk . Проще говоря: используя первое поле ввода в качестве ключа к хешированному массиву, если текущая строка ввода длиннее, чем то, что мы сохранили для массива (по умолчанию это пустая строка в perl), сохраните текущую строку. После того, как мы прочитали весь ввод (т.е. закончили), распечатайте каждый элемент хеша.

4
05.01.2019, 19:41
3 ответа

Отредактированный ответ

Привет, вы можете использовать этот скрипт

mlr --csv put 'if (NR == 1) {
counter=1;
  for (key in $*) {
    if (counter == 3) {
    $[key]=key;
    }
    counter += 1;
  }
}' input.csv

И на выходе вы получите:

a,b,c
1,2,c

NR == 1для получения первой строки и counter == 3для получения третьего поля.

5
27.01.2020, 20:51

Просто сawk:

awk 'BEGIN{ FS=OFS="," }{ (NR == 1)? c=$NF : $NF=c }1' file.csv

Пример вывода:

a,b,c
1,2,c
2
27.01.2020, 20:51

millerv5.6.0 позволяет использовать$[[fieldno]]для ссылки на значение имени номера поля "fldno" , поэтому в вашем случае имя поля 3 равно $[[3]].

    mlr --csv put '$c = $[[3]]' file.csv
2
27.01.2020, 20:51

Теги

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