如何在bash中将TXT文件格式化为结构化的CSV文件?
How to format a TXT file into a structured CSV file in bash?
我想在我的 Linux 服务器 (OpenSuse Leap 15.2) 上获得一些关于我的 CPU 温度的信息。所以我写了一个脚本,每 20 秒收集一次数据并将其写入文本文件。现在我已经删除了所有不需要的垃圾数据(比如“CPU Temp”等)。
现在我有这样一个文件:
47
1400
75
3800
前两行分别是 CPU 温度(摄氏度)和风扇转速(RPM)的读数。接下来的两行是相同测量值的另一个读数。
最后我想要这样的结构:
47,1400
75,3800
我的问题是:Bash 脚本可以为我做这件事吗?我用 sed
和 Awk 尝试了一些东西,但没有什么对我来说是完美的。此外,我想要一个 CSV 文件来制作图表,但我认为将文本文件转换为 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 'NR%2{printf "%s,",[=10=];next;}1' file.txt > file.csv
看看'paste'。这会将多行文本连接成一行,应该可以满足您的需求。
echo "${DATA}"
Name
SANISGA01CI
5WWR031
P59CSADB01
CPDEV02
echo "${DATA}"|paste -sd ',' -
Name,SANISGA01CI,5WWR031,P59CSADB01,CPDEV02
另一个 awk:
$ awk -v OFS=, '{printf "%s%s",[=10=],(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
[=12=], # output line
(NR%2?OFS:ORS) # and either a comma or a newline
}' file
既然你问过 bash
脚本是否可以做到这一点,这里有一个纯 bash
的解决方案。 ;o]
c=0
while read -r line; do
if (( c++ % 2 )); then
echo "$line"
else printf "%s," "$line"
fi
done < file
我想在我的 Linux 服务器 (OpenSuse Leap 15.2) 上获得一些关于我的 CPU 温度的信息。所以我写了一个脚本,每 20 秒收集一次数据并将其写入文本文件。现在我已经删除了所有不需要的垃圾数据(比如“CPU Temp”等)。
现在我有这样一个文件:
47
1400
75
3800
前两行分别是 CPU 温度(摄氏度)和风扇转速(RPM)的读数。接下来的两行是相同测量值的另一个读数。
最后我想要这样的结构:
47,1400
75,3800
我的问题是:Bash 脚本可以为我做这件事吗?我用 sed
和 Awk 尝试了一些东西,但没有什么对我来说是完美的。此外,我想要一个 CSV 文件来制作图表,但我认为将文本文件转换为 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 'NR%2{printf "%s,",[=10=];next;}1' file.txt > file.csv
看看'paste'。这会将多行文本连接成一行,应该可以满足您的需求。
echo "${DATA}"
Name
SANISGA01CI
5WWR031
P59CSADB01
CPDEV02
echo "${DATA}"|paste -sd ',' -
Name,SANISGA01CI,5WWR031,P59CSADB01,CPDEV02
另一个 awk:
$ awk -v OFS=, '{printf "%s%s",[=10=],(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
[=12=], # output line
(NR%2?OFS:ORS) # and either a comma or a newline
}' file
既然你问过 bash
脚本是否可以做到这一点,这里有一个纯 bash
的解决方案。 ;o]
c=0
while read -r line; do
if (( c++ % 2 )); then
echo "$line"
else printf "%s," "$line"
fi
done < file