如何使用不同的變數為文件的前 3 行加上前綴?

如何使用不同的變數為文件的前 3 行加上前綴?

所以我必須瀏覽我透過電子郵件發送的日誌(在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
    • 在下面幾行中,您使用內部變數NR,記錄行數。所以你去印變數s1,只有當你有第一行時,s2與第二個......等等。
    • 在後面的最後一行中,'您可以指定檔案名,這樣您就不需要呼叫該cat進程並將其通過管道傳遞給該awk進程。
    • 如果變數(ALPHA,BETA ...)可以透過某種機制產生(例如「Serial01,Serial02」),您可以將其取代行號和外部變數上的控制項。
  • 實用注意事項:在 *nix 下你可以命令序列Pipeline ( |) 可以將其輸出到以下內容,無需建立中間檔案。
    所以在你的例子中你可以直接使用:

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

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

更通用的解決方案:paste+awk

假設您的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

迴聲阿爾法>agrep.txt;貓 ”.msg" | 字串2>>agrep.txt

這可能不是確切的路線..這個概念是,你第一的想要將單字“Alpha”放入文件中..使用 > 符號建立文件,並使用 >> 附加到文件。如果沒有“換行符”,它應該在其中放置單字 ALPHA,然後附加第一條訊息。

您可能需要稍微嘗試一下才能使程式碼正常運作。

編輯:搜尋發現使用列印函數是比 echo 更好的選擇,因為 echo 可能會因作業系統而異

例如: cat ("ALPHA: ") > agrep.txt ;貓 ”.msg" | 字串2>>agrep.txt

為了執行“one liner”命令,第一個管道應該是 ;或 &&

;中間指令總是執行下一個指令 && 僅當前一個指令成功且 || 之間的指令才執行下一個指令(雙管道)僅當上一個指令失敗時才執行下一個指令

答案3

我不確定strings2你的輸入是什麼,所以我不能 100% 確定這會按預期工作。但也許它至少會為你指引正確的方向。cat可以接受來自標準輸入的輸入。所以,你也可以這樣做

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

相關內容