由于未知长度的文本文件,我怎么能读,例如所有,但第2行的文件?我知道tail会给我最后N行,但我不知道N是提前的.
所以对于一个文件
AAAA
BBBB
CCCC
DDDD
EEEE
Run Code Online (Sandbox Code Playgroud)
我想要
CCCC
DDDD
EEEE
Run Code Online (Sandbox Code Playgroud)
并为一个文件
AAAA
BBBB
CCCC
Run Code Online (Sandbox Code Playgroud)
我会得到的
CCCC
Run Code Online (Sandbox Code Playgroud) 我已经能够追踪基本的头/尾功能:
head -10 myfile <==> cat myfile | select -first 10
tail -10 myfile <==> cat myfile | select -last 10
Run Code Online (Sandbox Code Playgroud)
但是如果我想列出除前三个以外的所有行或除前三个之外的所有行,你怎么做?在Unix中,我可以做"head -n-3"或"tail -n + 4".对于PowerShell应该如何做这一点并不明显.
我有一个java进程打印出很多文本.有时我只是想看一些文字.使用普通程序,我可以这样做:
$ myprog | head
Run Code Online (Sandbox Code Playgroud)
我只会看到myprog的10行输出,它会立即退出.但是对于java,如果我这样做:
$ java MyClass | head
Run Code Online (Sandbox Code Playgroud)
我获得了前10行输出,但java进程在完成所有处理之前不会退出.这就像java并不关心stdout(System.out)已经消失,而且头部进程已经死了.
所有其他程序要么像猫一样默默地退出:
$ cat /etc/group | head
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
Run Code Online (Sandbox Code Playgroud)
或者退出管道错误/异常,如python:
$ python -c 'while True: print "hi"' | head
hi
hi
hi
hi
hi
hi
hi
hi
hi
hi
Traceback (most recent call last):
File "<string>", line 1, in <module>
IOError: [Errno 32] Broken pipe
Run Code Online (Sandbox Code Playgroud)
当我将输出管道输出到像head这样的东西时,如何在调用System.out.println()时让java引发异常?我希望能够做到这样的事情:
try {
while(true) {
System.out.println("hi");
}
} catch(BrokenPipeException e) {
// exit gracefully
}
Run Code Online (Sandbox Code Playgroud) 如果我有一个myownfile.txt包含3行文本的文件名.
foo
hello world
bar
Run Code Online (Sandbox Code Playgroud)
我想在中间显示只hello world使用head和tail命令的行.
我想说一个文件的输出行5-10,作为传入的参数.
我怎么能使用head,并tail做到这一点?
其中,firstline = $2和lastline = $3和filename = $1.
运行它应该如下所示:
./lines.sh filename firstline lastline
Run Code Online (Sandbox Code Playgroud) 假设我有一个包含任意行数的文件,比方说125.我想获得除第一个n之外的所有行,比方说,20.所以,我想要第21-125行.
有没有办法用tail/ head或其他工具做到这一点?
为什么不yes | head挂?
我以为系统会从中收集所有结果yes然后将其传递给它head,因为它yes是一个无限循环,系统会挂起.但是,它实际上可以停止并显示10行y.
系统如何管理停止yes时head完成收集数据?
是否有一个unix one liner来做这件事?
head -n 3 test.txt > out_dir/test.head.txt
grep hello test.txt > out_dir/test.tmp.txt
cat out_dir/test.head.txt out_dir/test.tmp.txt > out_dir/test.hello.txt
rm out_dir/test.head.txt out_dir/test.tmp.txt
Run Code Online (Sandbox Code Playgroud)
即,我想同时从给定文件中获取标题和一些grep行.
想象一下,我有一个包含许多子目录的目录,每个子目录包含一些具有相同结构的CSV文件(相同的列数,并且都包含相同的标题).
我知道我可以从父文件夹运行类似的东西
find ./ -name '*.csv' -exec cat {} \; > ~/Desktop/result.csv
Run Code Online (Sandbox Code Playgroud)
这将工作正常,期望每次重复标题(每个文件一次).
我也知道我可以做类似的事情sed 1d <filename>或tail -n +<N+1> <filename>跳过文件的第一行.
但就我而言,它似乎更专业.我想为第一个文件保留一次标题,然后跳过每个文件的标题.
是否有人知道使用标准Unix工具(如find,head,tail,sed,awk等)和bash实现这一目标的方法?
例如输入文件
/folder1
/file1.csv
/file2.csv
/folder2
/file1.csv
Run Code Online (Sandbox Code Playgroud)
每个文件都有标题:
A,B,C 每个文件都有一个数据行 1,2,3
期望的输出是:
A,B,C
1,2,3
1,2,3
1,2,3
Run Code Online (Sandbox Code Playgroud)
我觉得这是像其他问题不同的这个和这个特别,因为这些解决方案的参考文件1和文件2的解决方案.我的问题是关于一个具有任意数量文件的目录结构,我不希望逐个输出每个文件.
你有任何bash解决方案从stdout中删除N行吗?
像'head'命令一样,打印所有行,只有最后一个N.
关于bash的简单解释:
找到./test_dir/ | sed'$ d'| sed'$ d'| sed'$ d'| ...
但我需要复制sed命令N次
更好的解决方案?除了awk,python等......