Bash
如果數據可用,如何獲取文件名
我的輸入文件是
file_1.txt
,file_2.txt
,file_3.txt
等等。這些文件包含數據,例如$ head log_file_reset_*.txt ==> file_1.txt <== Test #1 data Test #2 data Test #3 Test #4 data ==> file_2.txt <== Test #1 Test #2 data Test #3 Test #4 data ==> file_3.txt <== Test #1 data Test #2 data Test #3 Test #4
Test
只有當Test
輸入文件中每個可用的數據是:#!/bin/bash ################################################################################################# CWD=$(pwd) for j in {1..5} do sed -n ' /^Test #/ { s/// = p } $= ' file_$j.txt \ | paste - - \ | awk -F '\t' ' NR > 1 && $1 - prevLine > ($2 ? 2 : 0) {print prev} {prevLine = $1; prev = $2} ' >> 1_val.txt
我從此程式碼中獲得的輸出儲存在
1_val.txt
:1_val.txt 1 2 4 2 4 1 2
我可以知道如何修改程式碼以獲取列出的數據的文件名(只是數字)
1_val.txt
並將其儲存在另一個名為的文件中2_val.txt
嗎?預期輸出:
2_val.txt 1 1 1 2 2 3 3
當你使用 awk 時,你永遠不需要 sed。以下是您應該如何在每個 Unix 機器上使用任何 shell 中的任何 awk 來真正執行問題中的 shell 腳本所做的事情(我能說的最好):
$ cat tst.awk FNR==1 { testId = "" } testId != "" { if (NF) { print testId } testId = "" } sub(/^Test #/,"") { testId = $0 }
$ awk -f tst.awk file_*.txt 1 2 4 2 4 5 1 2
然後將上面的內容列印到 1 個輸出文件並將文件編號列印到另一個文件就是這個調整:
$ cat tst.awk FNR==1 { testId = "" split(FILENAME,f,/[_.]/) fileId = f[2] } testId != "" { if (NF) { print testId > "1_val.txt" print fileId > "2_val.txt" } testId = "" } sub(/^Test #/,"") { testId = $0 }
$ awk -f tst.awk file_*.txt
$ head *_val.txt ==> 1_val.txt <== 1 2 4 2 4 5 1 2 ==> 2_val.txt <== 1 1 1 2 2 2 3 3
編輯以解決來自 OP 的以下評論:如果您不希望將上述 awk 腳本儲存在單獨的文件中,以下是如何在 shell 腳本中內聯使用上述 awk 腳本:
$ cat tst.sh #!/usr/bin/env bash awk ' FNR==1 { testId = "" split(FILENAME,f,/[_.]/) fileId = f[2] } testId != "" { if (NF) { print testId > "1_val.txt" print fileId > "2_val.txt" } testId = "" } sub(/^Test #/,"") { testId = $0 } ' "${@:--}"
然後您將shell腳本稱為:
$ ./tst.sh file_*.txt