【问题标题】:Joining Columns on Command Line with Paste or PR Not Working使用粘贴或 PR 在命令行上连接列不起作用
【发布时间】:2014-05-08 11:59:52
【问题描述】:

所以我有两个文件,我想从中取出列并将它们合并到一个文件中。

f1:

02/10/2013,16:00:00.091,123.82,OTCX,GLO,,123.82
02/10/2013,16:00:03.072,123.766,FXN,NAM,,123.766
02/10/2013,16:00:03.491,123.769,FXN,,,123.769
02/10/2013,16:00:03.565,123.79,COMM,ASI,HKG,123.79
02/10/2013,16:00:03.721,123.769,FXN,NAM,NYC,123.769
02/10/2013,16:00:04.194,123.81,AKM,EUR,MOW,123.81
02/10/2013,16:00:06.130,123.764,FXN,NAM,NYC,123.764
02/10/2013,16:00:06.330,123.764,FXN,,,123.764
02/10/2013,16:00:08.989,123.766,FXN,,,123.766
02/10/2013,16:00:09.034,123.791,FXN,,,123.791

f2:

02/10/2013,16:00:00.091,123.82,123.83,OTCX,GLO,
02/10/2013,16:00:03.072,123.766,123.888,FXN,NAM,
02/10/2013,16:00:03.491,123.769,123.888,FXN,,
02/10/2013,16:00:03.565,123.79,123.87,COMM,ASI,HKG
02/10/2013,16:00:03.721,123.769,123.891,FXN,NAM,NYC
02/10/2013,16:00:04.194,123.81,123.85,AKM,EUR,MOW
02/10/2013,16:00:06.130,123.764,123.891,FXN,NAM,NYC
02/10/2013,16:00:06.330,123.764,123.888,FXN,,
02/10/2013,16:00:08.989,123.766,123.886,FXN,,
02/10/2013,16:00:09.034,123.791,123.861,FXN,,

我在这里看到了对上一个 SO 问题的引用:How to paste columns from separate files using bash?

但由于某种原因,pastepr 命令都不适用于此数据集:paste -d <(cut -d "," -f 3,7 f1) <(cat f2) 只是在每行的前面附加一个逗号f2

,02/10/2013,16:00:00.091,123.82,123.83,OTCX,GLO,
,02/10/2013,16:00:03.072,123.766,123.888,FXN,NAM,
,02/10/2013,16:00:03.491,123.769,123.888,FXN,,
,02/10/2013,16:00:03.565,123.79,123.87,COMM,ASI,HKG
,02/10/2013,16:00:03.721,123.769,123.891,FXN,NAM,NYC
,02/10/2013,16:00:04.194,123.81,123.85,AKM,EUR,MOW
,02/10/2013,16:00:06.130,123.764,123.891,FXN,NAM,NYC
,02/10/2013,16:00:06.330,123.764,123.888,FXN,,
,02/10/2013,16:00:08.989,123.766,123.886,FXN,,
,02/10/2013,16:00:09.034,123.791,123.861,FXN,, 

pr -mts, 产生与粘贴相同的行为。

关于这些文件为何表现不同的任何建议?

谢谢!

【问题讨论】:

  • 你能展示一个你预期输出的样本吗?
  • 文件是否有 DOS 风格的行尾?
  • 是的,这绝对是CR 将光标放回行首,覆盖第一个文件打印的任何内容。在运行下面@glennjackman 提供的命令之前(这也修复了您在命令中的错误)执行此操作 - tr -d "\\r" < f1 > tmp && mv tmp f1
  • 最后的答案竟然是CR,通过'file'命令查出来的。感谢大家的帮助!

标签: bash cut command-line-interface


【解决方案1】:

请注意,您错过了给 -d 选项一个值。

将第 3 列和第 7 列放在“f2”行的开头,用逗号分隔

paste -d, <(cut -d, -f 3,7 f1) f2

计算 CRLF 行尾

paste -d, <(sed 's/\r$//' f1 | cut -d, -f 3,7) <(sed 's/\r$//' f2)

【讨论】:

  • &lt;(cat f2) 是猫的无用用法。
  • +1 用于修复 3 个问题!! UUoC,缺少分隔符和标识CR
  • 谢谢 Glenn - 我想给你和 jaypal 功劳,但你的回答不包括整个故事(见下面我的回答) - 如果你想修改你的答案以包括所有内容,我会接受你的。
【解决方案2】:

将两个答案(来自 jaypal 的 cmets + glenn 的答案)结合在一起,最终的答案原来是 CR 行尾。

对于整体答案,诊断此问题的一种方法是

file filename

如果它返回类似ASCII text, with CRLF line terminators 的内容,那么您就知道您遇到了这个问题。 CR = '\r', LF = '\n',所以实际上每一行都以 '\r\n' 结尾。

运行tr -d, "\r" &lt; f1 &gt; tmp &amp;&amp; mv tmp f1 将从代码中删除所有额外的“\r”,然后允许粘贴按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    相关资源
    最近更新 更多