我有一个包含多个文件的目录.txt
。
从每个文件中,我想选择第一行并将其打印到新.txt
文件中(以获取所有第一行的列表)。
我尝试使用awk
和sed
命令并将其与循环结合起来,但没有成功。
答案1
使用head
:
head -n1 -q *.txt > new-file
-n1
告诉head
仅提取第一行。-q
告诉 head 不要打印文件名。
在 OS X 上(可能还有一些其他 *nix 变体),该-q
选项不受支持head
。您需要自行删除文件名,例如
head -n1 *.txt | grep -v '==> ' > new-file
这仅在您知道输出不应包含字符串时才有效==>
。为了绝对确定,请使用循环(这比head
仅运行一次要慢得多):
for file in *.txt ; do
head -n1 "$file"
done
答案2
使用grep
:
grep -m 1 '.' *.txt >output.file
grep
将匹配任何字符并在第一次匹配后退出,grep
即将输出所有输入文件的第一行,并将这些保存在out.txt
。
答案3
仅使用 Bash:
for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done
*.txt
扩展为当前工作目录中以 结尾的文件夹/文件列表.txt
(因为只有以 结尾的文件夹.txt
才是值得关注的);<"$f" read line
从存储的文件路径中读取一行f
并将其存储在中line
;printf "$line\n" >>new.txt
line
:将的内容附加到new.txt
;
% cat foo.txt
line #1 in foo
line #2 in foo
line #3 in foo
% cat bar.txt
line #1 in bar
line #2 in bar
line #3 in bar
% for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done
% cat new.txt
line #1 in bar
line #1 in foo
答案4
使用 AWK 的另一种方法是告诉 AWK 打印,但然后立即转到下一个文件
tmp:$ touch file1 file2 file3
tmp:$ printf "Line 1 \n Line 2" | tee file1 file2 file3
Line 1
Line 2
tmp:$ awk '{print;nextfile}' file1 file2 file3
Line 1
Line 1
Line 1
sed
还允许打印特定行。在这里我将其与find
tmp:$ find . -name "file*" -exec sed -n '1p' {} \;
Line 1
Line 1
Line 1
和 perl:
tmp:$ find . -name "file*" -exec perl -ne 'print if 1..1' {} \;
Line 1
Line 1
Line 1
最后但并非最不重要 ,grep
tmp:$ grep -n 1 file1 file2 file3
file1:1:Line 1
file2:1:Line 1
file3:1:Line 1
> outputFile.txt
将所有内容保存到单个文件只需在这些命令末尾附加即可。