【问题标题】:Split space separated elements into separate lines将空格分隔的元素拆分为单独的行
【发布时间】:2017-07-30 20:57:19
【问题描述】:

如果我的文件包含不可预测的元素并用空格分隔,例如:

ABC123
ABC124
ABC125  ABC321  ABC222  ABC111  ABC333
ABC069  ABC450  ABC595

如何将它们分别打印在单独的行中? (python或grep/awk等)

【问题讨论】:

  • 您能展示一下您的尝试吗?
  • awk '{for (i=1;i
  • @user1658415:这表明您的单词之间不仅有空格,还有制表符;在这种情况下,tr -s '[:blank:]' '\n' < file 应该可以工作。

标签: python bash awk sed grep


【解决方案1】:

试试这个:

如果你只有空格:

tr -s ' ' '\n' < file

如果您有空格和制表符,那么按照@mklement0 的建议:

tr -s '[:blank:]' '\n' < file

awk '{for (i=1;i<=NF;i++) print $i}' file

egrep -o 'ABC[[:digit:]]{3}' file

egrep -o '[[:alnum:]]{6}' file

【讨论】:

  • 谢谢! awk '{for (i=1;i&lt;=NF;i++) print $i}' file 为我工作。我之前尝试过tr -s ' ' '\n' &lt; file,但没有成功。非常感谢!
【解决方案2】:

sed命令方法:

sed -E 's/\s+/\n/g' testfile

-E 选项,允许扩展正则表达式


awk 方法:

awk '{gsub(/ +/, "\n", $0); print}' testfile

gsub(regexp, replacement [, target])
target 中搜索 all 它可以找到的最长、最左侧、非重叠 个匹配子字符串,并且 用替换替换它们。 gsub() 中的“g”代表“全局”, 这意味着在任何地方替换       。


grep 方法:

grep -o '\S*' testfile

\S* - 匹配所有非空白序列

【讨论】:

  • 好的解决方案;值得注意的是,您的 sedgrep 命令仅适用于 GNU 实现。
【解决方案3】:

注意:以下所有解决方案逐行处理输入文件,以避免将整个文件加载到内存中,并使用行内制表符和空格。

使用标准 Unix 实用程序,VIPIN KUMAR's helpful answerPOSIX 兼容 tr 解决方案高效又简单,他的 POSIX 兼容 awk 解决方案运行良好也;一个更简单的不符合 POSIX 的解决方案是可能的 - 见下文。

tr 命令的通用 版本也处理行内部制表符 字符:

tr -s '[:blank:]' '\n' < file

使用 GNU awk 或 Mawk(但不使用 BSD/macOS awk):

awk -v RS='[[:space:]]+' '1' file

使用 grep(适用于 GNU 和 BSD/macOS grep):

grep -Eo '\S+' file

使用 Python(v2 和 v3):

Shell one-liner(bash,由于使用了$'...'):

python -c $'import fileinput\nfor line in fileinput.input(): print("\\n".join(line.split()))' file

在脚本中:

for line in open('file'):
  print("\n".join(line.split()))

使用 Ruby

壳单线:

ruby -ne 'puts $_.split' file

在脚本中:

File.open('file').each_line do |line|
  puts line.split
end

【讨论】:

    【解决方案4】:

    使用拆分:

    a = '''ABC123
    ABC124
    ABC125  ABC321  ABC222  ABC111  ABC333
    ABC069  ABC450  ABC595'''
    
    for item in a.split():
        print(item)
    

    给予:

    ABC123
    ABC124
    ABC125
    ABC321
    ABC222
    ABC111
    ABC333
    ABC069
    ABC450
    ABC595
    

    【讨论】:

      【解决方案5】:

      你可以使用xargs:

      xargs -n 1 < file
      

      输出:

      ABC123
      ABC124
      ABC125
      ABC321
      ABC222
      ABC111
      ABC333
      ABC069
      ABC450
      ABC595
      

      【讨论】:

      • 虽然这很短,但它会为每个输入参数创建一个/bin/echo 子进程,这非常低效。
      【解决方案6】:
      file = open("testfile.txt", "r")
      for line in file:
          newLine = line
          newLine = newLine.replace("\n","")
          newLine = newLine.split(" ")
          for eachElement in newLine:
              if eachElement!="" and len(eachElement)!=0:
                  print eachElement
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-06
        • 2012-01-28
        • 1970-01-01
        • 2017-02-05
        • 1970-01-01
        • 2018-06-09
        • 1970-01-01
        • 2020-10-24
        相关资源
        最近更新 更多