объединять/сортировать разные файлы и сохранять заголовок один раз вверху

Я провел небольшое исследование и обнаружил, что сочетания клавиш, включающие Ctrl в Linux, переключаются на американскую раскладку. ^ это`на клавиатурах США,поэтому следующие работы:

'.platform-win32,.platform-linux':
  'ctrl-shift-`': 'tree-view:reveal-active-file'

См. здесь для получения дополнительной информации об этом.

1
18.06.2020, 08:41
4 ответа

Вы не можете полагаться на использование NR>1и объединение перед всеми файлами сcat {} +
Таким образом, я пытаюсь повторно использовать ваш код, насколько это возможно:

{ 
    awk 'NR==1{print;exit}' *test*file*csv
    find. -type f -name '*test*file.csv' -exec awk 'NR>1' {} \; |
    sort -u
} > output.file

Выходной файл

ID,NAME,LOCATION
1,Vikrant,Gurgaon
22,abcd,Noida
2,Bharat,Noida
33,xyz,Hyderabad
3,Raju,Hyderabad

найти -выполнить {} +

-exec command {} +
This variant of the -exec action runs the specified command on the selected files, but the command line is built by appending each selected file name at the end

Итак, уже объединены

1
18.03.2021, 23:26

Немного изменив вашу командную строку, мы получим желаемый результат:

awk 'NR<2||FNR>1'./*test_file*.csv > temp ;
( head -n 1; sort -u; ) < temp > output.file

Ваши результаты находятся в файле output.file

-1
18.03.2021, 23:26

просто сделай:

find. -type f -name '*test*file.csv' -exec awk '!seen[$0]++' {} +

для каждой строки, которую читает awk, если это не (! )ранее установленный в связанном массиве с именем замеченный , который будет добавлен в массив, и, поскольку результат условия разрешается как «истина», поэтому эта строка отправляется на вывод, и если какая-либо та же строка читается awk, тогда результат условия будет «false», поэтому дубликаты будут пропущены;

В awk $0относится ко всей строке, и здесь мы использовали ключи массива, и значения будут увеличиваться для каждого считываемого ключа (строки ). для строки, если она не была задана в массиве, будет напечатано значение 0, а если значение для ключа >0, то оно будет пропущено.

1
18.03.2021, 23:26

С bashс использованием head, tailиsort:

Вы можете сохранить имена файлов в виде массива и

  • вывести строку заголовка первого файла
  • вывести содержимое всех файлов, начиная со строки 2 и sortрезультат с уникальной опцией
  • перенаправить вывод в файл
files=( *test*.csv )
{
  head -n1 "${files[0]}"
  for i in "${files[@]}"; do
    tail -n+2 "$i"
  done | sort -u
} > output
2
18.03.2021, 23:26

Теги

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