我有几百个txt文件,每个文件有2行。
要合并它们,我通常会这样做:
cat *.txt > final.txt
但是,我只需要对每个文件的第二行执行此操作,因此最终输出就像
2nd line of 1st file
2nd line of 2nd file
2nd line of 3rd file
(and so on..)
有什么想法可以实现这一目标吗?
答案 0 :(得分:1)
第一个解决方案: :能否请您尝试使用GNU awk
。 nextfile
是GNU awk
中非常好的选择,当条件为MET时,它将跳过当前Input_file中的所有行。
awk 'FNR==2{print;nextfile}' *.txt > output_file
第二个解决方案: :如果您没有GNU awk
,请尝试。在这里,由于我们假设nextfile
中没有awk
,所以我在每个文件的第二行上创建一个flag
,当它为TRUE时,简单地转到下一行/跳过它们并尝试保存某个时候注意,该标志值也将在每个文件的第一行上重置。
awk 'FNR==1{flag=""} FNR==2{print;flag=1} flag{next}' *.txt > output_file
第三种解决方案: 这里也使用while
和find
添加了head
和tail
方法。 AFAIK的头部和尾部不应读取整个文件。
while read line
do
head -n +2 "$line" | tail -1
done < <(find -type f -name "*.txt") > "output_file"
答案 1 :(得分:1)
使用GNU sed:
sed -n -s 2p *.txt > final.txt
或
sed -s '2!d' *.txt > final.txt
来自man sed
:
-s
:将文件视为独立文件,而不是单个连续的长流文件。
答案 2 :(得分:0)
find . -name "*.txt" -type f -exec awk 'NR==2' {} \;
答案 3 :(得分:0)
使用awk
awk 'FNR == 2 { print; nextfile }' *.txt > final.txt
FNR
包含当前文件中的行号。在第2行上时,它将打印该行,然后转到下一个文件。
答案 4 :(得分:0)
使用Perl
perl -ne ' if($.==2) { print ; close(ARGV) } ' *.txt
带有示例文件
$ cat allison1.txt
line1 in file1
line2 in file1
$ cat allison2.txt
line1 in file2
line2 in file2
$ cat allison3.txt
line1 in file3
line2 in file3
$ perl -ne ' if($.==2) { print ; close(ARGV) } ' allison*txt
line2 in file1
line2 in file2
line2 in file3
$