Использование однострочника 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), сохраните текущую строку. После того, как мы прочитали весь ввод (т.е. закончили), распечатайте каждый элемент хеша.
Отредактированный ответ
Привет, вы можете использовать этот скрипт
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
для получения третьего поля.
Просто сawk
:
awk 'BEGIN{ FS=OFS="," }{ (NR == 1)? c=$NF : $NF=c }1' file.csv
Пример вывода:
a,b,c
1,2,c
millerv5.6.0 позволяет использовать$[[fieldno]]
для ссылки на значение имени номера поля "fldno" , поэтому в вашем случае имя поля 3 равно $[[3]]
.
mlr --csv put '$c = $[[3]]' file.csv