![](/img/trans.png)
[英]Extract the last line from all text files by recursively searching from a specific directory
[英]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
您的代碼有兩個問題:
您有一個循環遍歷*
的外循環,但是您的循環主體不使用$files
。 也就是說,您要調用awk '...' *.txt
50次。 這就是為什么awk的任何輸出在result.txt
重復50次的原因。
您的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.