我要显示每两行,一行来自文件。我见过sed -n 'f~d'
awk
和per
l方法。但sed
一个不适用于osX(据我所知),另外两个是我无法使用的解释语言。
这是一个例子:
输出之前:
-rw-r--r-- 1 mfassi-f 2013 22 Jul 17 12:36 test.sh
-rw-r--r-- 1 mfassi-f 2013 29 Jul 17 12:30 test1.sh
-rw-r--r-- 1 mfassi-f 2013 22 Jul 17 12:36 test2.sh
-rw-r--r-- 1 mfassi-f 2013 29 Jul 17 12:30 test3.sh
-rw-r--r-- 1 mfassi-f 2013 22 Jul 17 12:36 test4.sh
-rw-r--r-- 1 mfassi-f 2013 29 Jul 17 12:30 test5.sh
-rw-r--r-- 1 mfassi-f 2013 22 Jul 17 12:36 test6.sh
后输出:
-rw-r--r-- 1 mfassi-f 2013 29 Jul 17 12:30 test1.sh
-rw-r--r-- 1 mfassi-f 2013 29 Jul 17 12:30 test3.sh
-rw-r--r-- 1 mfassi-f 2013 29 Jul 17 12:30 test3.sh
-rw-r--r-- 1 mfassi-f 2013 29 Jul 17 12:30 test5.sh
答案 0 :(得分:2)
[因为这个问题变得如此轻微,但这两个似乎太过相似而不能作为独立答案]。
您可以使用zsh
,ls
,cut
和paste
在for循环中执行此操作。这不是最干净的解决方案,但确实有效(令人惊讶)。
for file in `ls -1 | paste - - | cut -f 1`
do
ls -l -d $file
done
我们取ls -1
的输出,然后提取每隔一个文件名。 (ls
选择对文件进行排序的方式会对此产生影响)。然后,我们对每个文件执行ls -l -d
。如果-d
是目录,则ls
必须阻止$file
向我们展示$file
的内容。 (不确定这是否是OS X特定的,或者是否是默认的POSIX ls行为)。
如果您正在使用 zsh
解决方案,则可以执行以下操作:
$ jot 8 0 7 >> sample.txt # Generate some numbers.
$ count=0 # Storage variable
$ for i in `cat sample.txt`
do
if [ $(( $count % 2 )) -eq 0 ] ; then
echo $i
fi
count=`expr $count + 1`
done
每隔一行显示一次。
备注:强>
- 之后会在会话中留下变量count
(它不干净)
- 如果sample.txt
每行不包含一个单词,则严重失败
- 我几乎可以肯定我所做的模数比较不是最有效的:我从here抓住它。
- 我说它主要是 zsh,因为它确实依赖于cat
,但我不确定如何避免这种情况。
答案 1 :(得分:0)
OS {X}版sed
令人沮丧。使用sed -n '0~2p' <filename>
不起作用,因为在BSD sed中,-n
做了不同的事情:
-n
默认情况下,在将所有命令应用到标准输出后,每行输入都会回显到标准输出。 -n选项会抑制此行为。
我强烈建议安装GNU sed,可以使用Homebrew:
来完成brew install gnu-sed
然后你可以使用:
gsed -n '0~2p' filename # Display the 2nd, 4th etc
gsed -n '1~2p' filename # Display the 1st, 3rd etc.