【问题标题】:Awk with while loop in bash?在 bash 中使用 while 循环 awk?
【发布时间】: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 之后删除&lt; "$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


【解决方案1】:

您可以使用虚拟读取值,因此您不必剪切列:

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

您也可以使用您提供的代码。不工作吗?

另外,对于那些简单的情况,我建议您使用 cut 而不是 awk,因为 cutawk 轻很多:

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

很明显,只使用awk 是可能且更容易做到的。

【讨论】:

  • “虚拟读取值”是什么意思?我可以这样做:同时读取 FRAME LPARS _ _ RAM CPU1 CPU 2;做 ###; done
  • 是的。这些占位符将采用您不感兴趣的值。
猜你喜欢
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
相关资源
最近更新 更多