簡體   English   中英

使用awk從目錄中的所有文本文件中提取特定行

[英]Using awk to extract specific line from all text files in a directory

我有一個包含50個文本文件的文件夾,我想在命令行中從每個文本中提取第一行並將其輸出到result.txt文件。

我在包含正在使用的文件的目錄中使用以下命令:

for files in *; do awk '{if(NR==1) print NR, $0}' *.txt; done > result.txt

當我運行命令時,result.txt文件包含50行,但是它們全部來自目錄中的單個文件,而不是每個文件中的一行。 共同點似乎是循環了50次,而不是循環了50次。

如果有人可以幫助我了解我在哪里出錯了,我將不勝感激。

嘗試這個 -

for i in *.txt;do head -1 $i;done > result.txt

要么

for files in *.txt;do awk 'NR==1 {print $0}'  $i;done > result.txt

您的代碼有兩個問題:

  1. 您有一個循環遍歷*的外循環,但是您的循環主體不使用$files 也就是說,您要調用awk '...' *.txt 50次。 這就是為什么awk的任何輸出在result.txt重復50次的原因。

  2. 您的awk代碼將檢查NR (到目前為止已讀取的行數),而不是FNR當前文件中已讀取的行數)。 NR==1僅在第一個文件的開頭才為真。

還有一個問題: result.txt首先創建,因此它包含在*.txt 為避免這種情況,請給它一個不同的名稱(不以.txt結尾的名稱)或將其放在另一個目錄中。

可能的解決方法:

awk 'FNR==1 {print NR, $0}' *.txt > result

為什么不使用頭? 例如,使用find:

find midir/ -type f -exec head -1 {} \; >> result.txt

如果您想采用這種方法,則需要指定文件,而不要在awk中使用通配符:

for files in *; do awk '{if(NR==1) print NR, $0}' "$files"; done > result.txt

暫無
暫無

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

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