【发布时间】:2019-11-22 02:05:01
【问题描述】:
我对我的脚本有一个问题。
我有这种 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 来做到这一点?
感谢您的帮助!
【问题讨论】:
-
就我个人而言,我会用 awk 来完成,因为 awk 也可以打印
\t和\n。或者我会使用 Perl :) 。无论如何,如果您在done之后删除< "$arg",我认为您拥有的代码可能确实有效。 编辑并在 awk 代码中,将","更改为" "。 -
单独用awk很容易做到
awk -F',|;' '{ print "\nFRAME:",$1; print "==================="; print "\nLPARS:",$2; print "\nRAM:",$5; print "\nCPU1:",$6; print "\nCPU:",$7 }' input.txt
标签: linux bash csv awk while-loop