[英]Create TXT file from array in Bash
我有一個列表數組和一個文件file1.txt,我想根據file1.txt中的數字創建一個新的文件順序,例如代碼output必須如下所示。 我應該如何使它正常工作
新文件.txt 9 ZA C
但腳本給了我 newfile.txt 2 3 4 9
file1.txt 的內容如下隨機數 2 3 4 1
list=("Z" "A" "C" 9)
while read line
do
for i in ${list[@]};do
sed "${line}s/.*/${i}/" file1.txt > newmfile.txt
done
done < "file1.txt"
該腳本的主要問題是 sed 語句需要 /../ 在 $line 附近。 如果沒有這個,sed 將在行號上進行替換,並且不會搜索該行。 此外,由於更改未保留在原始 file1.txt 文件中,因此僅發生最后一次更改。 因此,您需要使用 sed -i 標志對實際文件執行更改,而不是重定向更改。 此外,有兩個循環是低效的。 只需使用計數器並使用計數器引用數組的元素:
#!/bin/bash
list=("Z" "A" "C" 9)
cp file1.txt newmfile.txt
cnt=0
while read line
do
sed -i "/${line}/s/.*/${list[$cnt]}/" newmfile.txt
cnt=$(($cnt+1))
done < "file1.txt"
您的file1.txt
包含映射:
$ nl file1.txt
1 2
2 3
3 4
4 1
其中上述 output 中的行號應替換為數組的內容,並根據文件中的編號重新排序。
這是一種方法,假設數組元素都不包含換行符:
list=("Z" "A" "C" 9)
printf '%s\n' "${list[@]}" | paste file1.txt - | sort -nk1,1 | cut -f2-
這使用paste
, sort
, cut
來裝飾-排序-取消裝飾。 Output:
9
Z
A
C
數字 9 是 for 循環 $i 的值。 當您聲明它運行到數組中的每個項目時,for 循環將繼續 4 次。
for i in ${list[@]}
使用數組中的項目數
list=("Z" "A" "C" 9)
您希望在新文本文件中實現的最終目標是什么? 因為您似乎正在嘗試將 file1.txt 中的數字基於數組? 如果您只是想將舊文件的內容復制到新文件 - 可以使用 echo 或 cat 輕松實現。 但我猜這不是你所追求的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.