Как отформатировать файл TXT в структурированный файл CSV в bash?
Я хотел получить некоторую информацию о температуре процессора на моем Linux Server (OpenSuse Leap 15.2). Поэтому я написал сценарий, который собирает данные каждые 20 секунд и записывает их в текстовый файл. Теперь я удалил все ненужные данные (например, «CPU Temp» и т. Д.).
Теперь у меня есть такой файл:
47
1400
75
3800
Первые две строки представляют собой одно показание температуры процессора в градусах Цельсия и скорости вращения вентилятора в об / мин соответственно. Следующие две строки - это еще одно показание тех же измерений.
В конце концов, мне нужна такая структура:
47,1400
75,3800
Мой вопрос: может ли сценарий Bash сделать это за меня? Я пробовал что-то с
sed
и Awk, но у меня ничего не работало идеально. Кроме того, я хочу, чтобы из файла CSV был график, но я думаю, что преобразовать текстовый файл в файл CSV - не проблема.
5 ответов
Ты можешь использовать
awk
:
awk 'NR%2{printf "%s,",$0;next;}1' file.txt > file.csv
Вы могли бы использовать
paste
paste -d, - - < file.txt
С участием
pr
pr -ta2s, file.txt
с участием
ed
ed -s file.txt <<-'EOF'
g/./s/$/,/\
;+1j
,p
Q
EOF
Другой awk:
$ awk -v OFS=, '{printf "%s%s",$0,(NR%2?OFS:ORS)}' file
Выход:
47,1400
75,3800
Разъяснил:
$ awk -v OFS=, '{ # set output field delimiter to a comma
printf "%s%s", # using printf to control newline in output
$0, # output line
(NR%2?OFS:ORS) # and either a comma or a newline
}' file
Поскольку вы спросили, может ли сценарий сделать это, вот решение в чистом виде
bash
. ;o]
c=0
while read -r line; do
if (( c++ % 2 )); then
echo "$line"
else printf "%s," "$line"
fi
done < file
Взгляните на «пасту». Это объединит несколько строк текста в одну строку и должно работать для того, что вы хотите.
echo "${DATA}"
Name
SANISGA01CI
5WWR031
P59CSADB01
CPDEV02
echo "${DATA}"|paste -sd ',' -
Name,SANISGA01CI,5WWR031,P59CSADB01,CPDEV02