0

我会显示每两行,文件中的一行。我见过sed -n 'f~d' awkand perl 方法。但是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
4

2 回答 2

2

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

[因为问题的变化如此之小,但这两个似乎太相似而不能作为独立的答案]。

您可以使用zshls和在 for 循环中执行此操作cutpaste这不是最干净的解决方案,但它确实有效(令人惊讶)。

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

每隔一行显示一次。

注意: - 这会在您的会话中
留下一个变量(它不干净)。 -如果每行不包含一个单词,这将严重失败。 - 我几乎可以肯定我所做的模数比较不是最有效的:我从这里抓取它。 - 我说它主要是zsh 因为它确实依赖于,但我不知道如何避免这种情况。count
sample.txt

cat

于 2013-07-17T10:40:40.437 回答
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. 
于 2013-07-17T10:25:15.667 回答