【问题标题】:insert character in particular position in shell在 shell 的特定位置插入字符
【发布时间】:2018-03-15 17:22:10
【问题描述】:

我有一个管道分隔文件,我想在字段/第 24 列之后添加一个新单词(表示为文件名作为示例),我尝试使用

awk -F "|" '{{$(NF-2)="filename.txt"} print $0 }' OFS="|"

但这会覆盖相邻的列。

如:

0|ZZZZZ|Mr XXXXX|73 Up hill|Hurley|Atherstone|||XXX XXX|GB|00.01.2017|2134567686|7902379xxx|01.09.2017|25|||239|Stores Sheffield|||07.01.2018|13.10.2016||X||NP

成为:

0|ZZZZZ|Mr XXXXX|73 Up hill|Hurley|Atherstone|||XXX XXX|GB|00.01.2017|2134567686|7902379xxx|01.09.2017|25|||239|Stores Sheffield|||07.01.2018|13.10.2016||filename|X||NP

使用 awk:

0|ZZZZZ|Mr XXXXX|73 Up hill|Hurley|Atherstone|||XXX XXX|GB|00.01.2017|2134567686|7902379xxx|01.09.2017|25|||239|Stores Sheffield|||07.01.2018|13.10.2016||filename|||NP

可以帮助我在特定位置添加单词而不覆盖。

【问题讨论】:

  • 为什么只有最后一行改变了?
  • 您要设置该列的值 (NF-3),还是添加具有该值的列?
  • @RomanPerekhrest - 没抓住你!!
  • @guido - 我想添加一个新列

标签: bash shell awk sed scripting


【解决方案1】:

这个怎么样,这个想法就像认为文件是 csv 但使用 | 作为分隔符:

awk -F"|" 'BEGIN { OFS = "|" } {$24="filename"}1' file

但是这个输出:

...13.10.2016|filename|X||NP

没有额外的| 就像在您想要的输出示例中一样:

...13.10.2016||filename|X||NP

会不会是笔误?

无论如何,@akshay-hegde 的回答都是简短而干净的:

awk  'BEGIN{FS=OFS="|"}{$24=FILENAME}1' file

【讨论】:

    【解决方案2】:

    使用支持 ERE 的 sed(-E-r,具体取决于您的 sed 版本):

    sed -E 's/(([^|]*\|){24})/\1filename.txt|/'
    

    【讨论】:

    • 我得到 -E 无效
    • -r 有效,感谢 Sundeep,现在得到正确的输出。
    • @NaP 是的,这取决于您的 sed 版本,-E 是 POSIX,但仍然不能在任何地方移植,例如 -r 在 osx 上不可用
    • @NaP 当您的问题得到解答时,请参阅 stackoverflow.com/help/someone-answers
    【解决方案3】:

    我有一个管道分隔文件,我想在字符位置 24 之后添加一个新单词(表示为文件名作为示例),

    在 char 位置 24,它不会给出预期的输出,可能你需要如下,它将记录中的第 24 列设置为 filename.txt,

    0|ZZZZZ|Mr XXXXX|73 Up hill|Hurley|Atherstone|||XXX XXX|GB|00.01.2017|2134567686|7902379xxx|01.09.2017|25|||239|Stores Sheffield|||07.01.2018|13.10.2016||X||NP
                           ^
                           |
                      This is 24th char position
    

    因为你没有发布没有代码标签,我假设它是一行,总共包含 27 个字段,其中分隔符是管道 (|)

    awk  'BEGIN{FS=OFS="|"}{$24="filename.txt"}1' file
    

    如果您想在第 24 字段使用当前文件名,请使用 FILENAME

    awk  'BEGIN{FS=OFS="|"}{$24=FILENAME}1' file
    
    • 你已经试过了,NF-2 给出 25,你仍然可以更正你的 使用NF-3 编写代码,以便修改第 24 个字段

    要在 char 位置 24 处插入一些字符串,我更喜欢 sed

    sed -r -e 's/^.{24}/&filename.txt/' filename
    

    【讨论】:

      【解决方案4】:
      awk -F\| '{ for (i=1;i<=NF-2;i++) { printf "%s|",$i };printf "%s","filename";for (i=NF-1;i<=NF;i++) { printf "|%s",$x } }' filename
      

      打印所有|分隔字段最多 X 并使用 for 循环打印。打印“文件名”,然后打印剩余的字段。

      【讨论】:

        猜你喜欢
        • 2012-12-01
        • 2021-09-25
        • 1970-01-01
        • 2020-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多