0

我需要转换充满这样行的文件:

# 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
4

2 回答 2

2

您只需一行即可解决此问题:

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

产量:

2007.04.29.10.01.17
于 2013-05-01T23:56:19.377 回答
1
echo "# 2007  4 29 10  1 17.98 blah  other   stuff" | tr -s " "

由于空间分隔的可变性,我tr结合使用,修剪多个空格。cuttr -s ' '

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

echo "# 2007  4 29 10  1 17.98 blah  other   stuff" | tr -s " " | cut -d'#' -f2 | cut -d' ' -f4
于 2013-05-02T02:33:34.867 回答