首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BASH:在空格分隔的文件上使用cut :将两个空格视为一个

BASH:在空格分隔的文件上使用cut :将两个空格视为一个
EN

Stack Overflow用户
提问于 2013-05-02 07:45:22
回答 2查看 1.5K关注 0票数 0

我需要转换充满行的文件,如下所示:

代码语言:javascript
复制
# 2007  4 29 10  1 17.98 blah  other   stuff

格式如下所示的行

代码语言:javascript
复制
2007.04.29.10.01.17

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

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

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

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

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-02 07:56:19

只需一行awk代码即可解决此问题

代码语言:javascript
复制
% awk '/^#/ {printf "%04d.%02d.%02d.%02d.%02d.%02d\n", $2, $3, $4, $5, $6, $7}' ~/stuff 

收益率:

代码语言:javascript
复制
2007.04.29.10.01.17
票数 2
EN

Stack Overflow用户

发布于 2013-05-02 10:33:35

代码语言:javascript
复制
echo "# 2007  4 29 10  1 17.98 blah  other   stuff" | tr -s " "

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

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

代码语言:javascript
复制
echo "# 2007  4 29 10  1 17.98 blah  other   stuff" | tr -s " " | cut -d'#' -f2 | cut -d' ' -f4
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16328188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档