Bash

如果數據可用,如何獲取文件名

  • December 13, 2021

我的輸入文件是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

引用自:https://unix.stackexchange.com/questions/681135