我对我的脚本有一个疑问。
我需要使用脚本来处理这种csv文件:
RXK7;MIAO24;Running;Linux;24;16;32;DefaultPool;shared
RXK6;MIAO24;Running;Linux;24;16;32;DefaultPool;shared
RXK4;MIAO24;Running;Linux;24;16;32;DefaultPool;shared
RXK1;MIAO24;Running;Linux;24;16;32;DefaultPool;shared
RXK2;MIAO24;Running;Linux;24;16;32;DefaultPool;shared
RXK5;MIAO24;Running;Linux;24;16;32;DefaultPool;shared
RXK3;MIAO24;Running;Linux;24;16;32;DefaultPool;shared
我只想保留1,2,5,6和7列。为此,我使用以下命令:
cat test.csv | awk -F',|;' '{print $1","$2","$5","$6","$7}'
结果是:
RXK7,MIAO24,24,16,32
RXK6,MIAO24,24,16,32
RXK4,MIAO24,24,16,32
RXK1,MIAO24,24,16,32
RXK2,MIAO24,24,16,32
RXK5,MIAO24,24,16,32
RXK3,MIAO24,24,16,32
使用我的脚本:
#!/bin/bash
OLDIFS=$IFS
IFS=','
for arg
do
echo "File :" $arg | cut -d'.' -f1
echo "======================================================="
echo ""
while read FRAME LPARS RAM CPU1 CPU2
do
if [[ $FRAME != $PREV ]]
then
PREV=$FRAME
echo "FRAME : $FRAME"
echo -e "-----------------\n"
fi
echo -e "LPARS :\t$LPARS\n\
RAM : \t$RAM\n\
CPU 1 :\t$CPU1\n\
CPU 2 :\t$CPU2\n"
echo ""
done < "$arg"
done
我可以像这样显示我的不同csv的这些信息:
File : test2
=======================================================
LPARS :
RAM :
CPU 1 :
CPU 2 :
FRAME : RXK7
-----------------
LPARS : MIAO24
RAM : 24
CPU 1 : 16
CPU 2 : 32
FRAME : RXK6
-----------------
LPARS : MIAO24
RAM : 24
CPU 1 : 16
CPU 2 : 32
FRAME : RXK4
-----------------
LPARS : MIAO24
RAM : 24
CPU 1 : 16
CPU 2 : 32
FRAME : RXK1
-----------------
LPARS : MIAO24
RAM : 24
CPU 1 : 16
CPU 2 : 32
FRAME : RXK2
-----------------
LPARS : MIAO24
RAM : 24
CPU 1 : 16
CPU 2 : 32
FRAME : RXK5
-----------------
LPARS : MIAO24
RAM : 24
CPU 1 : 16
CPU 2 : 32
FRAME : RXK3
-----------------
LPARS : MIAO24
RAM : 24
CPU 1 : 16
CPU 2 : 32
但这只有在我事先创建一个临时文件的情况下才有可能:
cat test.csv | awk -F',|;' '{print $1","$2","$5","$6","$7}' > test2.csv
我想知道是否可以在不创建临时文件的情况下执行此操作?我想是这样的:
for arg
do
echo "File :" $arg | cut -d'.' -f1
echo "======================================================="
echo ""
cat $arg | awk -F',|;' '{print $1","$2","$5","$6","$7}' | while read FRAME LPARS RAM CPU1 CPU2
do
if [[ $FRAME != $PREV ]]
then
PREV=$FRAME
echo "FRAME : $FRAME"
echo -e "-----------------\n"
fi
echo -e "LPARS :\t$LPARS\n\
RAM : \t$RAM\n\
CPU 1 :\t$CPU1\n\
CPU 2 :\t$CPU2\n"
echo ""
done < "$arg"
done
或者也许只用awk可以做到这一点?
谢谢您的帮助!
答案 0 :(得分:2)
您可以使用虚拟读取值,因此不必减少列数:
while read FRAME LPARS _ _ RAM CPU1 CPU2
do
# Things
done < "$arg"
您还可以使用提供的代码。它不起作用吗?
此外,在这些简单情况下,我建议您使用cut
而不是awk,因为cut
比awk
轻很多:
cut -d; -f1,2,5-7 test.csv
很明显,仅使用awk
可能且容易。