awk在bash中使用while循环?

时间:2019-07-12 10:00:36

标签: linux bash csv awk while-loop

我对我的脚本有一个疑问。

我需要使用脚本来处理这种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可以做到这一点?

谢谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您可以使用虚拟读取值,因此不必减少列数:

while read FRAME LPARS _ _ RAM CPU1 CPU2
do
    # Things
done < "$arg"

您还可以使用提供的代码。它不起作用吗?

此外,在这些简单情况下,我建议您使用cut而不是awk,因为cutawk轻很多:

cut -d; -f1,2,5-7 test.csv

很明显,仅使用awk可能且容易。