如何用不同的变量作为文件前三行的前缀?

如何用不同的变量作为文件前三行的前缀?

因此,我必须查看通过电子邮件发送给我的日志(在 Windows 中),搜索一行来确定型号的序列号,我想一个简单的方法是编写一个丑陋的批处理脚本来转换 .msg,以便我可以读取该文件。例如:

cat "*Pre*.msg" | strings2 > agrep.txt
cat agrep.txt | grep "D24" > a21s.txt
cat a21s.txt | cut -d" " -f7 > Air21Serials.txt

这样我就剩下 3 个唯一的数字,我该如何将 ALPHA 添加到第 1 行、将 BETA 添加到第 2 行以及将 GAMMA 添加到第 3 行,并使用空格或 : 作为分隔符?


更新:该文件a21s.txt类似于

0 1 BXP_0 AIR21B4AB2P KRC118046/1 R3B D240090254 20140416 
0 1 BXP_1 AIR21B4AB2P KRC118046/1 R3B D240088108 20140414 
0 1 BXP_2 AIR21B4AB2P KRC118046/1 R3B D240090208 20140414 

答案1

有很多方法可以完成您要搜索的内容,仅举几个例子。

awk 以及量身定制的解决方案

针对您的示例量身定制的一个解决方案是使用awk并向其传递 3 个变量。这并不通用,因为如果您有 4 行,则必须传递 4 个变量,依此类推...

该命令有一种简单的方法,可以通过列号( ,...最后一个) awk来管理列。$1$2$NF

  • 为了让这里的阅读更加简单,我使用了你的旧中间文件a21s.txt

    awk -v s1="ALPHA" -v s2="BETA" -v s3="GAMMA" '
      NR==1 {print s1,$7} ;  
      NR==2 {print s2,$7} ;  
      NR==3 {print s3,$7} ; '   a21s.txt
    
    • 在第一行中,您awk使用选项传递 3 个变量-v
    • 在以下几行中,您使用内部变量天然橡胶,保持行数的计数。因此,你去打印变量s1,只有当你有第一行时,s2与第二个...等等。
    • 在最后一行之后,'您可以指定文件名,这样您就不需要调用该cat过程并将其传送到该awk过程。
    • 如果变量(ALPHA、BETA……)可以通过某种机制生成(例如“Serial01、Serial02”),则可以将其放置在行号和外部变量上的控件上。
  • 实用说明:在 *nix 下你可以命令序列将一个输出通过管道 ( |) 传输到以下输出,无需创建中间文件。
    因此,在您的示例中,您可以直接使用:

    cat "*Pre*.msg" | strings2 | grep "D24" | cut -d" " -f7 > Air21Serials.txt
    

    在这种情况下,cut您可以使用awk命令cat "*Pre*.msg" | strings2 | grep "D24" | awk '...' > final_file.txt

更通用的解决方案pasteawk

假设您有一个a21s.txt文件和另一个文件(b.txt),它们的行数相同,并且包含您想要添加前缀的字符串(每个单词)(如下所示)。

ALPHA
BETA
GAMMA

你可以简单地使用

paste b.txt a21.txt | awk '{print $1,$8}' >  Air21Serials.txt

请注意,现在您的序列号列是第 8 列,因为您之前已通过粘贴添加了另一个列。


笔记

man awk向 Linux本身询问更多信息man paste :-)

答案2

回声 ALPHA>agrep.txt ; 猫“.msg”|字符串2>>删除文件

这可能不是确切的路线。概念是,你第一的想要将单词“Alpha”放入文件中。使用 > 符号创建文件,使用 >> 附加到文件。如果没有“换行符”,则应该将单词 ALPHA 放入其中,然后附加第一条消息。

您可能需要玩一会儿才能使代码正常工作。

编辑:搜索发现使用printf是比 echo 更好的选择,因为 echo 可能会因操作系统的不同而不同

例如:cat ("ALPHA: ") > agrep.txt ; cat ".msg”|字符串2>>删除文件

对于执行“一行”命令,第一个管道应该是 ; 或 &&

; 命令之间总是执行下一个命令 && 命令之间只有前一个命令成功时才执行下一个命令 并且 || (双管道)只有前一个命令失败时才执行下一个命令

答案3

我不确定strings2你的输入是什么,所以我不能 100% 确定这会按预期工作。但也许它至少会为你指明正确的方向。cat可以接受来自 stdin 的输入。所以,你也可以这样做

echo ALPHA: | cat - "*Pre*.msg" | strings2 > agrep.txt
echo BETA: | cat - agrep.txt | grep "D24" > a21s.txt
echo GAMMA: | cat - a21s.txt | cut -d" " -f7 > Air21Serials.txt

相关内容