Последний элемент массива не печатается должным образом из цикла
При изучении текстовых фильтров оболочки я создал небольшой скрипт awk, который форматирует вывод файла CSV, предоставляя встроенный заголовок.
Сценарий оболочки-оболочки вызывается из командной строки, и все, что он на самом деле делает, - это оборачивает скрипт awk и передает аргумент как переменную regex
, которая является строкой поиска.
Сценарий сохраняет поля первой записи (NR==1
) в массиве heading
.Как только запись, содержащая строку поиска regex
, найдена в теле CSV-файла, сценарий объединяет заголовок с соответствующим значением.
csv.sh:
#!/bin/bash
awk -f ~/Scripts/csv.awk -v "regex=$1" $2
csv.awk:
BEGIN {FS=",";}
NR==1 {
for (i=1; i<=NF; i++) {
heading[i]=$i;
}
}
NR>1 {
if ($0 ~ regex) {
for (i=1; i<=length(heading); i++) {
if(length($i) > 0) {
print(heading[i] ": " $i)
}
}
print("")
}
}
Демонстрация
ship.csv:
name,country,displacement,length,beam,commissioned
Yamato,Japan,65027,256,38.9,16 December 1941
USS Enterprise,United States of America,19800,251.4,33.4,12 May 1938
Bismarck,Germany,41700,251,36,24 August 1940
HMS Dreadnought,United Kingdom,18120,160.6,25,2 December 1906
USS Iowa,United States of America,46000,270.43,32.97,22 February 1943
HMS Vanguard,United Kingdom,45200,248.2,32.9,12 May 1946
Вызов
$ csv Enterprise ships.csv
Ожидаемый результат
name: USS Enterprise
country: United States of America
displacement: 19800
length: 251.4
beam: 33.4
commissioned: 12 May 1938
Вывод терминала:
name: USS Enterprise
country: United States of America
displacement: 19800
length: 251.4
beam: 33.4
: 12 May 1938
На моем компьютере с Linux (Manjaro) вывод очень похож.Но на самом деле, если я перенаправлю вывод на pbcopy
на моем Mac, заголовок появится после вставки:
name: USS Enterprise
country: United States of America
displacement: 19800
length: 251.4
beam: 33.4
commissioned
: 12 May 1938