【问题标题】:Change file formatting using linux filters使用 linux 过滤器更改文件格式
【发布时间】:2011-10-26 16:19:27
【问题描述】:

我是这个 shell 脚本编程的新手,所以需要你的帮助来编写一个高效的代码。

输入文件格式:

60 00 00 00
00 90 32 20
00 00 00 00
.....

输出文件格式:

6000 0000 0090 3220 0000 0000 0000 0000
0000 0000 0000 0001 0000 0000 0000 0000 
......

我想将输入文件转换为输出文件,反之亦然,所以双方都需要代码。

代码应该在 linux shell 脚本中,使用 awk、sed、grep 等过滤器,使用管道和 linux 重定向运算符...

限制

单行最好,否则少得多。尽可能多的行

【问题讨论】:

  • 以后,包括您之前所做的任何尝试,无论多么可怕或失败。这有助于我们准确地了解您遇到的问题,让我们写出不仅解决您的问题而且教给您一些东西的答案。
  • @TimPost okk..thanx 的建议,我以后肯定会记住这件事......

标签: bash shell awk pipe


【解决方案1】:

这是解决此问题的一个相当简单的方法。

while read line; do
   block1=`echo $line | awk '{ print $1$2 }'`
   block2=`echo $line | awk '{ print $3$4 }'`
   echo "$block1 $block2 " >> outputfile
done < inputfile

我不确定您是否需要在 8 个块之后插入新行,但如果需要,像 s/(.*){32}/$1\n/g 这样的正则表达式应该可以解决问题。

【讨论】:

  • 是的,我确实需要 8 个块后的换行符,你如何计算 8 个块,我将替换这个正则表达式。请也对其进行编辑..
  • k 抱歉,我认为这 32 已经足够了,我应该先尝试一下。谢谢,抱歉
【解决方案2】:

在 bash 中可以很简单:

while read a b c d; do printf "%s%s " $a $b $c $d; done < file

如果您需要换行符:

i=0
while read a b c d; do
    printf "%s%s " $a $b $c $d
    if (( ++i == 4 )); then 
        echo
        i=0
    fi
done < file

或者,使用 awk

awk '
    {printf("%s%s %s%s ", $1, $2, $3, $4)}
    NR % 4 == 0 {print ""}
' file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多