У меня есть один вопрос по поводу моего сценария.
У меня есть такой 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 -F',|;' '{ print "\nFRAME:",$1; print "================== = "; print "\nLPARS:",$2; print "\nRAM:",$5; print "\nCPU1:",$6; print "\nCPU:",$7 }' input.txt





Вы можете использовать фиктивные значения чтения, поэтому вам не нужно сокращать столбцы:
while read FRAME LPARS _ _ RAM CPU1 CPU2
do
# Things
done < "$arg"
Вы также можете использовать код, который вы предоставили. Это не работает?
Кроме того, я бы посоветовал вам использовать cut вместо awk для этих простых ситуаций, так как cut намного легче, чем awk:
cut -d; -f1,2,5-7 test.csv
И понятно, что это возможно и проще сделать только с awk.
Что вы подразумеваете под «фиктивными значениями чтения»? Я могу сделать: пока читаю FRAME LPARS _ _ RAM CPU1 CPU 2; делать ###; done <"$arg" А "_ _" - это столбцы 3 и 4?
да. Эти заполнители примут значения, которые вас не интересуют.
Лично я бы сделал это только с помощью awk, так как awk также может печатать
\tи\n. Или я бы использовал Perl :). В любом случае, если вы удалите< "$arg"послеdone, я думаю, что код, который у вас есть, действительно может работать. Редактировать и в коде awk измените","на" ".