【问题标题】:UNIX Shell Script remove one column from the fileUNIX Shell 脚本从文件中删除一列
【发布时间】:2012-07-06 14:14:54
【问题描述】:

我有一个类似如下的文件:

Header1:value1|value2|value3|
Header2:value4|value5|value6|

列号未知,我有一个函数可以返回列号。

我想编写一个脚本,可以从文件中删除一列。例如,删除第 1 列后,我会得到:

Header1:value2|value3|
Header2:value5|value6|

我使用cut 来实现这一点,到目前为止,我可以在删除一列但没有标题后给出值。例如

value2|value3|
value5|value6|

谁能告诉我如何添加标题?或者任何命令都可以直接做到这一点?谢谢。

【问题讨论】:

标签: linux bash shell unix scripting


【解决方案1】:

用管道替换冒号,执行cut 命令,然后再次用冒号替换第一个管道:

sed 's/:/|/' input.txt | cut ... | sed 's/|/:/'

您可能需要调整 cut 命令的列号,以确保不计算标题。

【讨论】:

  • 您好,感谢您的帮助。真是个好主意,我以前没有这样想,我努力将标题添加回我所拥有的东西。我试过你的方法。它有效。但它似乎需要一点修正,sed 's/:/|/'。我是 shell 脚本的新手,所以不确定它是否适合我(我正在使用 ksh)。
  • 是的,我不经常使用sed,并且在发布之前没有测试过。
【解决方案2】:

把':'变成'|',这样头部就是另一个字段,而不是第一个字段的一部分。您可以在任何生成数据开始时执行此操作,或者通过在cut 之前通过tr ':' '|' 传递数据。然后,您的其余字段将被 +1 抵消,但这应该很容易弥补。

【讨论】:

  • 正确,但在给出的示例中,似乎只有一个。如果有更多的可能性,sedawk 可能更合适。
【解决方案3】:

您的问题是 HeaderX 后跟 ':' 这不是您在 cut 中使用的 '|' 分隔符。

你可以先用 : 将你的行分成两部分,比如 "cut -f 1 --delimiter=: YOURFILE",然后删除第一列,然后放回标题。

【讨论】:

    【解决方案4】:

    awk 可以处理多个分隔符。所以另一种选择是......

    jkern@ubuntu:~/scratch$ cat ./data188 
    Header1:value1|value2|value3|
    Header2:value4|value5|value6|
    jkern@ubuntu:~/scratch$ awk -F"[:|]" '{ print $1 $3 $4 }' ./data188 
    Header1value2value3
    Header2value5value6
    

    【讨论】:

    • +1 - awk -F"[:|]" 'BEGIN {OFS = "|"} { print $1 ":" $3, $4 }' ./data188 将恢复分隔符。另外,请在发帖时缩短提示。 “$”就足够了。它有助于提高可读性。
    【解决方案5】:

    您可以只使用sed 而不使用cut

    sed 's/:[^|]*|/:/' input.txt
    

    【讨论】:

      【解决方案6】:

      我的解决方案:

      $ sed 's,:,|,' data | awk -F'|' 'BEGIN{OFS="|"}{$2=""; print}' | sed 's,||,:,'
      Header1:value2|value3|
      Header2:value5|value6|
      
      • : 替换为|
      • -F'|' 告诉 awk 使用 | 符号作为字段分隔符
      • 在每一行中,我们用空字符串替换第二个(因为标题现在成为第一个)字段,并用新的字段分隔符 (|) 替换打印结果行
      • 通过将第一个 | 替换为 : 返回标头

      不完美,但应该可以。

      【讨论】:

        【解决方案7】:

        $ cat file.txt | grep 'Header1' | awk -F"1" '{ print $1 $2 $3 $4}'

        这将在单独的列中打印所有值。您可以打印任意数量的列。

        【讨论】:

          【解决方案8】:

          只是加入 Perl 解决方案:
          (根据需要重新排列/删除字段)

          -l 有效地为每个打印语句添加一个换行符
          -a 自动拆分模式使用 -F 表达式将每一行拆分为数组 @F
          -n 在 -e 代码周围添加一个循环
          -e 你的'一个班轮'遵循这个选项

          $ perl -F[:\|] -lane 'print "$F[0]:$F[1]|$F[2]|$F[3]"' input.txt
          

          【讨论】:

            猜你喜欢
            • 2017-01-25
            • 2016-05-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-10
            相关资源
            最近更新 更多