【问题标题】:Remove CRLF in large unix file, within a row连续删除大型 unix 文件中的 CRLF
【发布时间】:2016-07-28 03:55:30
【问题描述】:

数据文件有 672 列,以制表符作为分隔符,CRLF 位于每一行的末尾,并且在一行内有效地将一行拆分为多行。

    ***Current***
    row1: col1<\t>col2<\t>col3<\t>col4<\r\n>
    row2: col1<\t>col2<\r\n>
          col3<\r\n>
          col4<\r\n>

    ***Expected***
    row1: col1<\t>col2<\t>col3<\t>col4<\r\n>
    row2: col1<\t>col2<\t>col3<\t>col4<\r\n>

【问题讨论】:

  • 在您的样本上,您如何只能检测到 2 行?
  • @user3089834:不确定你在问什么,这只是“当前”和“结束状态”的一个示例。在 unix 上,我使用 head 对文件中的数据进行采样。
  • 如果数据在一行中有 CRLF 作为您的样本,如果您无法检测到行尾,则无法解决您的问题。和我一起,我在您的示例数据上看到 4 行,因为我认为“\r\n”是一行的结尾。
  • 我认为这是一个定义明确的问题。不幸的是,它不是一个使用 unix/linux 面向行的工具可以轻松解决的问题。理想情况下,解决方案是返回源并在从源中提取它时对其进行修复。这里发布了问题的解决方案,但通常作者使用奇怪的术语,不包括一个很好的例子(如你所见)和其他寻找答案的障碍。希望有书面答案的人之一会看到这一点并提供帮助。我会为bash 和/或awk 添加一个标签,以吸引更多的读者。将 #of flwrs 悬停在您的标签上。好L
  • @BalajiGA - 期待看到您的尝试。我有一个简单的解决方案,但我想在发布之前先看看你的作品。

标签: linux unix newline


【解决方案1】:

这是脚本reorder.sh,执行时将创建输出文件expected.txt

#!/bin/bash

input_file=$1;
j=1
for i in `awk '{for(k=1;k<=NF;++k) print $k}' $input_file`
do
        if [ $(( $j % 4 )) -eq 0 ]; then
                echo $i >> expected.txt
        else
                echo -n $i"     " >> expected.txt
        fi
        ((++j))
done

./reorder.sh current.txt

【讨论】:

    【解决方案2】:

    以下 sed 脚本帮助我删除了 CRLF 字符。

    script.sed:join /\$/{N s/\\n// b join }
    

    调用上述脚本的方法

    sed  -f  script.sed  chap4  > chap4.new
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      相关资源
      最近更新 更多