【问题标题】:A simple but logical issue with file formatting using awk使用 awk 格式化文件的一个简单但合乎逻辑的问题
【发布时间】:2011-10-30 12:56:22
【问题描述】:

我对这些 awk 和 shell 东西不熟悉,遇到了一个简单但合乎逻辑的问题..

输入文件:

6000 9876 5675 ....
8576 8765 9845 ...
....

输出文件:(必填)

60 00 98 76 56 75 ....
85 76 87 65 98 45 ...
....

将输出转换为输入是一项相当简单的任务

awk '{printf("%s%s %s%s %s%s %s%s", $1, $2, $3, $4, $5, $6, $7, $8)}' output_file
                                                          > input_file

但是将输入转换为输出我猜不到

(虽然我认为NF 的一些逻辑可以解决这个问题,但也事先不知道字段的数量)但主要问题是即使我不知道。的文件然后如何进行呢?

最小。要读取的单元将类似于$1,$2 等。我需要打破它们并需要在它们之间插入一个空格。

我对@9​​87654326@ 了解不多,但我尝试了一下。可能对sedregex 进行一些操作可以帮助我。

请提供您宝贵的建议。`

【问题讨论】:

  • 抱歉标题中formatting 的拼写错误。感谢编辑...

标签: regex bash shell sed awk


【解决方案1】:

这是一个 sed 示例:

$ echo "1234 5678 9012"|sed -e 's/\([0-9][0-9]\)\([0-9][0-9]\)/\1 \2/g'
12 34 56 78 90 12

【讨论】:

  • 您已经知道输入仅包含数字和空格,也许<<<"1234 5678 9012" sed -r 's/(..)(..)(\s)?/\1 \2\3/g' 可能就足够了。
【解决方案2】:
tr -d ' ' < inputFile | sed 's/../& /g'

或者避免第一个tr:

sed -e 's/ //g' -e 's/../& /g'

【讨论】:

  • 你能解释一下 &amp; 到底在做什么吗?正如我所提到的,我对这些事情很陌生,所以只是出于好奇而问。
  • &amp; 在这里表示要替换的两个字符,即 sed 命令告诉自己替换每个两个字符的序列,后跟一个空格字符。第一个 tr 命令从初始文件中删除所有空间以简化 sed 处理。
  • 这会在换行符之前留一个空格吗?
  • 确实如此,但这个问题很容易解决:... -e 's/ $//'
【解决方案3】:

由于问题标题提到“awk”,我给出了一个 awk 解决方案,尽管已经接受了答案:

这需要傻瓜:

kent$  echo "6000 9876 5675
8576 8765 9845"|awk '{for(i=1;i<=NF;i++)$i=gensub(/^([0-9]{2})([0-9]{2})$/,"\\1 \\2","g",$i);print }'                                    
60 00 98 76 56 75
85 76 87 65 98 45

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 2018-01-01
    • 1970-01-01
    • 2019-02-12
    相关资源
    最近更新 更多