每两行显示一行(osX)zsh

时间:2013-07-17 09:57:08

标签: macos unix zsh

我要显示每两行,一行来自文件。我见过sed -n 'f~d' awkper 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

2 个答案:

答案 0 :(得分:2)

这是两个答案。一个用于文件,一个用于命令行输入。

[因为这个问题变得如此轻微,但这两个似乎太过相似而不能作为独立答案]。

您可以使用zshlscutpaste在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.