Cách chọn dòng đầu tiên từ mỗi tệp trong một thư mục và in nó thành tệp văn bản mới


13

Tôi có một thư mục với một số .txttập tin.

Từ mỗi tệp này, tôi muốn chọn dòng đầu tiên và in nó thành một .txttệp mới (để có danh sách tất cả các dòng đầu tiên).

Tôi đã thử nó với awksedlệnh và kết hợp nó với một vòng lặp, nhưng không thành công.


1
Như bạn là người dùng uy tín 6: Nếu bất kỳ anwsers dưới đây giúp bạn, đừng quên nhấn vào màu xám ở bên trái của văn bản của nó, có nghĩa Vâng, câu trả lời này là hợp lệ ! ;-)
Fabby

Câu trả lời:


21

Sử dụng head:

head -n1 -q *.txt > new-file
  • -n1nói headđể giải nén dòng đầu tiên.
  • -q nói với đầu không in tên tệp.

9

Sử dụng grep:

grep -m 1 '.' *.txt >output.file

grepsẽ khớp với bất kỳ ký tự nào và sẽ thoát sau khớp đầu tiên, tức là grepsẽ xuất các dòng đầu tiên của tất cả các tệp đầu vào và chúng tôi đang lưu chúng vào out.txt.


1
Tôi thích điều này, nó là một hack nhỏ đẹp.
Hashim

2

Chỉ sử dụng Bash:

for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done
  • *.txtđược mở rộng vào danh sách các thư mục / tệp kết thúc .txttrong thư mục làm việc hiện tại (vì chỉ có các tệp thư mục kết thúc .txtkhông phải là một mối quan tâm);
  • <"$f" read lineđọc một dòng từ đường dẫn tệp được lưu trữ fvà lưu trữ nó trong line;
  • printf "$line\n" >>new.txt: Gắn thêm nội dung của 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

kos, hơi dài một chút nhưng ở đây là +1 ..
heemayl

@heemayl Nhưng đó chỉ là Bash. ;)
kos

1
Chúc

1
@heemayl Cảm ơn: D. Thành thật mà nói, tôi đang kiểm tra trang web như điên chỉ vì mục đích bảo vệ một câu hỏi XD
kos

0

Bạn đã thử nó với awk, đây là một awkphiên bản

awk 'FNR==1 {print} {nextfile}' *.txt > out

0

Một cách tiếp cận khác với AWK là bảo AWK in, nhưng sau đó lập tức chuyển sang tệp tiếp theo

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

sedcũng cho phép in các dòng cụ thể. Ở đây tôi đã kết hợp điều đó vớifind

tmp:$ find . -name "file*" -exec  sed -n '1p' {} \;                            
Line 1 
Line 1 
Line 1 

Và perl:

tmp:$ find . -name "file*"  -exec perl -ne 'print  if 1..1' {} \;              
Line 1 
Line 1 
Line 1 

Và cuối cùng nhưng không kém phần quan trọng , grep

tmp:$ grep -n 1 file1 file2 file3                                              
file1:1:Line 1 
file2:1:Line 1 
file3:1:Line 1 

Lưu tất cả mọi thứ vào một tệp chỉ là vấn đề nối thêm > outputFile.txtvào cuối các lệnh này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.