我有一個名為alldatalist.txt的檔案,其中包含:
./19970327/datalist.txt
../19970328/datalist.txt
../19970329/datalist.txt
../19970330/datalist.txt
../19970331/datalist.txt
../19970401/datalist.txt
../19970402/datalist.txt
../19970403/datalist.txt
../19970404/datalist.txt
../19970405/datalist.txt
每個檔案(或alldatalist.txt中的行)都有自己的內容(例如,第一個檔案/行):
$ cat .../19970327/datalist.txt
19970327_0100.xyz
19970327_0200.xyz
19970327_0300.xyz
19970327_0400.xyz
19970327_0500.xyz
我一直在撓頭,試圖用alldatalist.txt檔案中的 "外部 "路徑來列印后者,所以要得到這個:
./19970327/19970327_0100.xyz
../19970327/19970327_0200.xyz
../19970327/19970327_0300.xyz
../19970327/19970327_0400.xyz
../19970327/19970327_0500.xyz
cat alldatalist.txt | xargs cat產生的每個檔案(或alldatalist.txt中的行)的內容沒有所需的路徑,所以我可能包括paste cut(或basename)工具,使用for回圈添加每個路徑,但似乎這可能是一個過于復雜的解決方案。我想知道你是否能給我建議一個技巧,以更干凈和/或更簡單的方式添加該路徑。
歡迎任何支持。
uj5u.com熱心網友回復:
你可以直接在檔案中每一行的開頭加上基本的目錄名,然后列印內容(確保目錄名與sed不沖突,如果沖突,你可以使用sed的r命令,從包含dirname的檔案中安全讀取):
while read -r line; do
dir="$(dirname "$line")/span>/"
sed "s|^|$dir|g" < "$line"
done < alldatalist.txt
uj5u.com熱心網友回復:
你可以用一個shell回圈和sed輕松地做到這一點:
while IFS= read -r filename; do>
b=${filename%/*}
sed "s%^%$b%"/span> "$filename"
done < alldatalist.txt
或者類似地使用xargs和Awk:
xargs -a alldatalist.txt awk '
FNR==1 { b = FILENAME; sub(/[^/]*$/, "", b) }
{ print b $0 }'
在shell回圈中,shell 引數擴展 ${variable%pattern}產生variable的值,并將任何與pattern的匹配從末尾移除。 同樣有一個${variable#pattern}的前綴替換;詳情請見手冊。
由于替換的字串包含一個字面的斜線,我們使用%作為sed中的模式定界符來代替;請參見在sed命令和范圍地址中使用不同定界符
在Awk腳本中,我們使用xargs來給awk輸入盡可能多的檔案名,只要適合它的命令列,并對所有這些檔案運行Awk腳本。 FNR變數包含了當前檔案中的行號(或更普遍的記錄);因此在每個檔案的第一行,我們重新計算b的值,然后將其作為前綴列印在所有輸出行上。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/332511.html
標籤:
