【问题标题】:adding a text to beginning of a line based on input in the file根据文件中的输入将文本添加到行首
【发布时间】:2014-03-30 03:27:18
【问题描述】:

您好,我有一项艰巨的任务(至少对我而言)要完成。我需要执行以下操作:

这是我的意见

host1
atetley 170.198.19.165 91 18 6 4198
NJPYNYFWD01 170.198.82.143 257 14 6 4749
NJTTKLFWD01 170.198.82.142 257 13 6 3993
host2
dfriel 198.177.151.69 91 14 6 2023
host3
dfriel 198.177.151.69 91 14 6 2023
fklotz 198.177.151.81 91 15 6 1829
ganthos 198.177.151.92 91 20 6 791

我需要以下输出

host1 atetley 170.198.19.165 91 18 6 4198
host1 NJPYNYFWD01 170.198.82.143 257 14 6 4749
host1 NJTTKLFWD01 170.198.82.142 257 13 6 3993
host2 dfriel 198.177.151.69 91 14 6 2023
host3 dfriel 198.177.151.69 91 14 6 2023
host3 fklotz 198.177.151.81 91 15 6 1829 
host3 ganthos 198.177.151.92 91 20 6 791

完全不知道该怎么做。我确实可以控制如何在输出文件中注入主机名(例如 host1 主机 host3 )。所以我可以说在每个主机之前放一个唯一标识符,比如“uuu”

uuuhost1
atetley 170.198.19.165 91 18 6 4198
NJPYNYFWD01 170.198.82.143 257 14 6 4749
NJTTKLFWD01 170.198.82.142 257 13 6 3993
UUUhost2
dfriel 198.177.151.69 91 14 6 2023
UUUhost3
dfriel 198.177.151.69 91 14 6 2023
fklotz 198.177.151.81 91 15 6 1829
ganthos 198.177.151.92 91 20 6 791

但我仍然需要这样的结果。如果添加唯一标识符有帮助。文件主计算结束后,我可以稍后将其剥离。示例从文件中取出所有“UUU”

host1 atetley 170.198.19.165 91 18 6 4198
host1 NJPYNYFWD01 170.198.82.143 257 14 6 4749
host1 NJTTKLFWD01 170.198.82.142 257 13 6 3993
host2 dfriel 198.177.151.69 91 14 6 2023
host3 dfriel 198.177.151.69 91 14 6 2023
host3 fklotz 198.177.151.81 91 15 6 1829 
host3 ganthos 198.177.151.92 91 20 6 791

谁能帮我解决这个问题?

【问题讨论】:

    标签: linux bash sed awk tr


    【解决方案1】:

    你可以使用 awk 来打印它:

    awk 'NF==1{h=$1;next} {print h, $0}' file
    host1 atetley 170.198.19.165 91 18 6 4198
    host1 NJPYNYFWD01 170.198.82.143 257 14 6 4749
    host1 NJTTKLFWD01 170.198.82.142 257 13 6 3993
    host2 dfriel 198.177.151.69 91 14 6 2023
    host3 dfriel 198.177.151.69 91 14 6 2023
    host3 fklotz 198.177.151.81 91 15 6 1829
    host3 ganthos 198.177.151.92 91 20 6 791
    

    【讨论】:

    • 对不起,逻辑如下:基本上我cat文件然后我必须告诉它找到第一个主机名(host1)。一旦找到它,它就必须将 host1 添加到它之后和找到下一个主机名“host2”之前的任何行数。我不认为一个简单的 awk 命令可以做到这一点?
    • 就是这个命令死了。您是否检查了附加的输出,它是否与您的预期输出不匹配?
    • 大声笑 :) @jaypal 我现在看到我的错字了。你可以运行:"echo ${comment/ies/oes}"
    • 嗨,这是有效的..谢谢anubhava,我今天检查了它,因为我必须做其他工作..再次感谢。我仍然知道这个命令是如何工作的
    【解决方案2】:
     awk 'NF==1{p=$1;next}$0=p FS$0' file
    

    【讨论】:

    • 嗨,肯特。我不认为这种逻辑适用于我需要做的事情。主机名 (host1 host2 host3) 可以是任何东西,并且可以以任何顺序出现,因此它将从哪里获得 $1 名称。逻辑必须在文件中找到主机名。它们没有任何特定的顺序
    • 嗨,主机名可以是任意名称和任意长度,这就是我的意思
    【解决方案3】:

    这是我的尝试:

    awk '/^host/ {host=$1} NF>1{print host, $0}' <myfile
    

    我的文件包含

    host1
    atetley 170.198.19.165 91 18 6 4198
    NJPYNYFWD01 170.198.82.143 257 14 6 4749
    ...
    

    它对每一行执行以下操作:

    如果该行以 host 开头(如果它匹配 // 一个正则表达式,^host 是 : ^ 以 host 开头),则将第一个字段 ($1) 分配给变量“host”

    如果字段数大于1(NF>1),打印变量host,行($0)

    【讨论】:

      【解决方案4】:

      在 bash 中:

      while read FIRST REST
      do
          [ ${FIRST:0:4} = "host" ] && HOST="$FIRST" || echo "$HOST $FIRST $REST"
      done <inputfile
      

      【讨论】:

        【解决方案5】:

        这可能对你有用(GNU sed):

        sed -r '/^\S+$/{h;d};G;s/(.*)\n(.*)/\2 \1/' file
        

        将主机名保存在保留空间中并将其添加到非主机名行

        【讨论】:

          猜你喜欢
          • 2021-10-05
          • 1970-01-01
          • 2010-12-08
          • 2012-12-15
          • 1970-01-01
          • 2017-07-31
          • 2017-02-06
          • 2017-03-28
          • 1970-01-01
          相关资源
          最近更新 更多