BASH:在空格分隔文件上使用剪切:将两个空格视为一个空格

时间:2013-05-01 23:45:22

标签: bash shell awk sh cut

我需要转换完整行的文件,如下所示:

# 2007  4 29 10  1 17.98 blah  other   stuff

格式为这样的行

2007.04.29.10.01.17

原始行以空格分隔,当出现一个位数位数(例如4)时,它会被列为“4”。当我转换它时,我需要能够将它改为'04'。因此,有空格分隔文件,空格是前导零的占位符。

我需要编写一个shell脚本来进行转换。我尝试使用cut命令,因为每个字符都保持在同一个位置,因此第7个字符始终是分隔空格,第8个字符始终是十位数,或者应该是前导零的空格。然而,我很快发现它将两个空格视为一个,这完全抛弃了计数(因为有时候我有'4',有时我会'14'。

所以:我需要一种方法来读取和转换这个文件,使用cut或其他方法(awk?),这将允许我这样做。无论是修改我当前代码的方法(下面)还是其他可以更好地工作的方法都将非常感激。

仅供参考,我现在的代码如下:

while read LINE
do
    #IF line starts with '#', then
    if [[ $LINE == "#"* ]]; then

       #123456789012345678901
        # 2008 12 26 11 26 20.36
        # 2007  5 10  1  8 10.52

        #GET 4 digit year
        LINEyear=$(echo $LINE | cut -c3-6)

        #GET 2 digit month
        if [ $(echo $LINE | cut -c8-8) == " " ]; then
            LINEmonth=0$(echo $LINE | cut -c8-9)                
        else
            LINEmonth=$(echo $LINE | cut -c8-9)
        fi

        #GET 2 digit day
        if [ $(echo $LINE | cut -c11-11) == " " ]; then
            LINEday=0$(echo $LINE | cut -c11-12)
        else
            LINEday=$(echo $LINE | cut -c11-12)
        fi

        #GET hour, min, sec, (Removed to save space)

        LINEnew=$LINEyear.$LINEmonth.$LINEday.$LINEhour.$LINEmin.$LINEsec
        echo $LINEnew

    fi
done

2 个答案:

答案 0 :(得分:2)

您可以在的一行中解决此问题:

% awk '/^#/ {printf "%04d.%02d.%02d.%02d.%02d.%02d\n", $2, $3, $4, $5, $6, $7}' ~/stuff 

收率:

2007.04.29.10.01.17

答案 1 :(得分:1)

echo "# 2007  4 29 10  1 17.98 blah  other   stuff" | tr -s " "

我将trcut结合使用,因为空格分隔的可变性,tr -s ' '修剪了多个空格。

然后,使用cut忽略#(除非你想要它作为一个字段),然后第二次选择,说第四个字段:

echo "# 2007  4 29 10  1 17.98 blah  other   stuff" | tr -s " " | cut -d'#' -f2 | cut -d' ' -f4