簡體   English   中英

使用awk或sed命令循環從文件中打印大量特定行

[英]Printing numerous specific lines from file using awk or sed command loop

我有一個帶有ID名稱的大型txt文件。 它有2500行,一列。 我們稱它為file.txt

H3430
H3467
H9805

另外,我還有另一個文件index.txt,其中包含390個數字:

1
4
9
13
15

這些數字是我必須從file.txt中提取的(ID的)行數。 我需要生成另一個文件,稱為newfile.txt,它只有index.txt要求的特定行中的390個ID(列表的第一個ID,第四個,第九個,依此類推)。

因此,我嘗試執行以下循環,但沒有成功。

num=$'index.txt'
for i in num
do
awk 'NR==i' "file.txt" > newfile.txt
done

對於這個問題,我是個菜鳥。所以,我需要一些幫助。 即使是在我的循環或您建議的新解決方案中。 謝謝 :)

讓我們創建一個示例文件,使用seq模擬您的2500行文件:

$ seq 2500 > /tmp/2500

並使用示例將行號打印到名為390的文件中:

$ echo "1
4
9
13
15" > /tmp/390

您可以通過將行號讀取到數組中並在該數組中打印行來在文件2500中打印N行:

$ awk 'NR==FNR{ a[$1]++; next} a[FNR]' /tmp/390 /tmp/2500

您還可以使用sed命令文件:

$ sed 's/$/p/' /tmp/390 > /tmp/sed_cmd
$ sed -n -f /tmp/sed_cmd /tmp/2500

使用GNU sed,您可以sed 's/$/p/' /tmp/390 | sed -n -f - /tmp/2500 sed 's/$/p/' /tmp/390 | sed -n -f - /tmp/2500但在OS X上不起作用:-(

您可以這樣做:

$ sed -n -f <(sed 's/$/p/' /tmp/390) /tmp/2500

您可以將index.txt文件讀入地圖,然后將其與file.txt的行號進行比較。 將輸出重定向到另一個文件。

awk 'NR==FNR{line[$1]; next}(FNR in line){print $1}' index.txt file.txt > newfile.txt

當您使用兩個文件時,必須使用FNR,因為新文件啟動時它將重置為1(相反,NR將繼續增加)。

正如Ed Morton在評論中建議的那樣。 然后可以對命令進行優化,以進一步刪除{print $1}因為awk默認情況下會根據真相進行打印。

awk 'NR==FNR{line[$1]; next} FNR in line' index.txt file.txt > newfile.txt

如果index.txt已排序,我們可以按順序遍歷file.txt
這樣可以將操作數量減少到最少(更快的腳本):

awk 'BEGIN
     {  indexfile="index.txt"
        if ( (getline ind < indexfile) <= 0)
             { printf("Empty %s\n; exiting",indexfile);exit }
     }
     {  if ( FNR <  ind ) next
        if ( FNR == ind ) printf("%s %s\n",ind,$0)
        if ( (getline ind < indexfile) <= 0) {exit}
     }' file.txt

如果文件未真正排序,請使用sort快速排序:

sort -n index.txt > temp.index.txt
rm index.txt
mv temp.index.txt index.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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