【问题标题】:opening a tab delimitted file using linux commands使用 linux 命令打开制表符分隔文件
【发布时间】:2023-04-07 19:40:01
【问题描述】:

我很难打开制表符分隔的文件。客户说它肯定是制表符分隔的,但似乎没有文本限定符。

我正在运行这个语句:

 awk '{OF=OFS="\t"}{print $1,$2,$10,$12,$14,$20}' AECPRDA.TAB | head -10

以及我得到的输出:

+-----------------------------------------------------------------------+
| 22746528        BKEN48DVD       NEVER   050     R       N             |
| 22746535        BKEN48BR        NEVER   050     R       N             |
| 25584998        WD1194190DVD    DTS)    /       DOL     29.99         |
| 21548598        DSND001906102.2 /       001     11.49   8             |
| 25812794        WHV1000292717BR /       050     PG13    N             |
| 25812787        WHV1000284958DVD        SPEC    GRAVITY /       PG13  |
| 21425462        PBSDMST64400DVD SEASON  (3PC)   CLASSIC:        050   |
| 25584974        WD1194170BR     (WS     DTS     DIGC)   AC3           |
| 21388262        HBO1000394029DVD        3       OF      SEASON  59.98 |
| 25688450        WD11955700DVD   /       DOL)    THE     050           |
+-----------------------------------------------------------------------+

我不相信这些列是正确的“标签”:

这是文件的纯文本示例:

22746528    BKEN48DVD   AW40    48  18  METALLICA (2PC) THROUGH THE NEVER (2PC) 050 090     R   12.99   19.98   85611500487 01/28/2014          N   N   30      1   A   1   11/27/2013  01/24/2014  11/27/2013  11/27/2013
22746535    BKEN48BR    AW40    48  BR  METALLICA (2PC) THROUGH THE NEVER (2PC) 050 090     R   16.25   24.98   85611500488 01/28/2014          N   N   30      1   A   2   11/27/2013  01/24/2014  11/27/2013  11/27/2013
25584998    WD1194190DVD    0819    1194190 18  FROZEN / (WS DOL DTS)   FROZEN / (WS DOL DTS)   050 110     G   21.25   29.99   78693683896 03/18/2014          N   N   0       2   A   3   12/20/2013  03/20/2014  12/20/2013  12/20/2013
21548598    DSND001906102.2 0107    001906102   02  FROZEN / O.S.T. FROZEN / O.S.T. 001 024         11.49   13.95   05008729574 11/25/2013          N   N   8       1   E   4   10/07/2013  03/20/2014  10/07/2013  10/07/2013
25812794    WHV1000292717BR 0526    1000292717  BR  GRAVITY / (UVDC)    GRAVITY / (UVDC)    050 093     PG13    29.49   35.99   88392924457 02/25/2014          N   N   30      1   E   5   01/16/2014  02/11/2014  01/16/2014  01/16/2014

我的 AWK 命令有什么问题吗?为什么标签设置不正确?是否有我遗漏的隐藏“空格”限定符?

这是我从某人那里得到的解释,但我想使用 AWK NOT excel 来实现它(gd forbid):

制表符分隔可能不会对齐。制表符已定义 在不同的操作系统中有所不同。通常定义为 显示时有 4 或 5 个空格。所以如果你的艺术家名字是 5 字符,然后是制表符,然后标题将从 字符位置 9. 如果下一行艺术家是 20 个字符 长,然后是制表符,然后标题将出现在位置 24. 希望这会有所帮助。 (另一个想法,告诉用户在 excel 中打开一个空白电子表格并使用文本导入)

非常感谢您的指导!

【问题讨论】:

  • 我不太了解{OF=OFS="\t"} 部分。不应该是BEGIN{FS=OFS="\t"} 将输入输出字段分隔符设置为制表符吗?
  • 如果您“不相信这些列是正确的制表符”,那么它并不是真正的制表符分隔文件,您需要了解您的输入格式实际上是什么以及是否可以形式化(可能使用正则表达式)。
  • 请看我的更新,我认为现在应该更清楚了,但我不知道如何实现它
  • 如果你不信,试着数一数每一行的字段数:awk -F '\t' '{print NF}' filename
  • 这是一个巨大的痛苦,excel打开这个没有问题,但是awk没有,我不明白

标签: excel sed awk grep delimiter


【解决方案1】:

应该这样做:

awk 'BEGIN {FS=OFS="\t"} NR<=10 {print $1,$2,$10,$12,$14,$20}' AECPRDA.TAB

【讨论】:

  • 请看我的更新,我认为现在应该更清楚了,但我不知道如何实现它
  • 您不需要head -10,将其替换为NR&lt;=10
  • 你第一篇文章中的纯文本,是你使用的数据吗?我没有得到和你一样的结果。
  • 你得到什么结果?有趣的是,当我将它以制表符分隔的形式导入 excel 时,一切正常:screencast.com/t/PmWxitMrGyiL
  • 首先尝试在您的输入文件上运行dos2unix,以确保您在每行的末尾没有多余的 control-M,例如如果您的文件是在 Windows 上创建的。
【解决方案2】:

我已经解决了!

而不是使用这种制表符:"\t"

我需要使用$'\t'

不过,我还没有找到有关原因的文档。

最终答案:

awk -F$'\t' 'BEGIN{OF=OFS}{print $1,$2,$10,$12,$14,$20}' AECPRDA.TAB | head -10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-29
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多