Я немного новичок в среде Linux. Я все рассмотрел для ответа на это - извинения, если это было задано раньше.
Я написал awk script, который работает с большим текстовым файлом (11 концертов, 40 столбцов, 48M строк). script называется "cycle.awk". Он заменяет столбец новой версией. Это требует, чтобы данные сначала сортировались в этом конкретном столбце. Чтобы запустить script во всех столбцах, я написал команду bash следующим образом:
cat input.csv |
sort -k 22 -t "," | awk -v val=22 -f cycle.awk |
sort -k 23 -t "," | awk -v val=23 -f cycle.awk |
sort -k 24 -t "," | awk -v val=24 -f cycle.awk |
sort -k 25 -t "," | awk -v val=25 -f cycle.awk |
sort -k 26 -t "," | awk -v val=26 -f cycle.awk |
sort -k 27 -t "," | awk -v val=27 -f cycle.awk |
sort -k 28 -t "," | awk -v val=28 -f cycle.awk |
sort -k 29 -t "," | awk -v val=29 -f cycle.awk |
sort -k 30 -t "," | awk -v val=30 -f cycle.awk |
sort -k 31 -t "," | awk -v val=31 -f cycle.awk |
sort -k 32 -t "," | awk -v val=32 -f cycle.awk |
sort -k 33 -t "," | awk -v val=33 -f cycle.awk |
sort -k 34 -t "," | awk -v val=34 -f cycle.awk |
sort -k 35 -t "," | awk -v val=35 -f cycle.awk |
sort -k 36 -t "," | awk -v val=36 -f cycle.awk |
sort -k 37 -t "," | awk -v val=37 -f cycle.awk |
sort -k 38 -t "," | awk -v val=38 -f cycle.awk |
sort -k 39 -t "," | awk -v val=39 -f cycle.awk |
sort -k 40 -t "," | awk -v val=40 -f cycle.awk |
sort -k 41 -t "," | awk -v val=41 -f cycle.awk > output.csv
Я считаю, что должен быть более элегантный способ сделать это. Как я могу написать bash script, который позволит мне передать столбцы, которые я хочу применить к awk script, а затем выполнить такую процедуру трубопровода без необходимости создавать временные файлы данных? Я избегаю временных файлов, потому что входной файл настолько велик, и меня интересует оптимальная производительность.
BTW, script выглядит следующим образом. Это в основном сокращает значения некоторых столбцов для сжатия текстового файла. Любые указатели на то, как его затянуть? Эти процедуры занимают около 10 часов.
BEGIN{ FS=","; OFS=","; count=1 }
NR == 1 { temp=$val }
{
if ( temp != $val ) {
temp=$val;
count++;
}
$val=count
print $0
}
Вход обычно выглядит примерно так:
id,c1
1,abcd
2,efgh
3,abcd
4,abcd
5,efgh
где соответствующий выход будет:
id,c1
1,1
2,2
3,1
4,1
5,2
Технически, он будет отсортирован с помощью c1, но это не точка.