簡體   English   中英

從 Bash 中的數組創建 TXT 文件

[英]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-

這使用pastesortcut來裝飾-排序-取消裝飾。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM