从某一行开始排序文件

时间:2009-08-14 14:51:52

标签: linux bash sorting

我希望能够对文件进行排序,但仅限于某一行及以下。从手动排序无法解析内容所以我需要第二个实用程序来执行此操作。读?或者awk可能吗?这是我希望能够排序的文件:

tar --exclude-from=$EXCLUDE_FILE --exclude=$BACKDEST/$PC-* \
-cvpzf $BACKDEST/$BACKUPNAME.tar.gz \
/etc/X11/xorg.conf \
/etc/X11/xorg.conf.1 \
/etc/fonts/conf.avail.1 \
/etc/fonts/conf.avail/60-liberation.conf \

所以对于这种情况,我想开始在第三行排序。我想我将不得不做一个能够像

这样做的功能
cat backup.sh | while read LINE; do echo $LINE | sort; done

这是相当新的,脚本看起来像是缺少一些东西。此外,不知道如何从某个行号开始。

有什么想法吗?

6 个答案:

答案 0 :(得分:3)

这样的东西?

(head -n 2 backup.sh; tail -n +3 backup.sh | sort) > backup-sorted.sh

您可能必须修改输入的最后一行...它可能没有用于行继续的尾随\,因此如果您只是执行上述操作,则可能会损坏'backup-sorted.sh'

您可能需要考虑使用tar的--files-from(或-T)选项,并在数据文件中使用已排序的文件列表而不是脚本本身。

答案 1 :(得分:1)

笨拙的方式:

len=$(cat FILE | wc -l)
sortable_len=$((len-3))

head -3 FILE > OUT
tail -$sortable_len FILE | sort >> OUT

我相信很快会有人发布优雅的1-liner。

答案 2 :(得分:1)

排除(2行)标题以外的行,仅用于查看。

cat file.txt | awk '{if (NR < 3) print $0 > "/dev/stderr"; else print $0}' | sort

排除(2行)标题以外的行,并将输出发送到另一个文件。

方法#1:

cat file.txt | awk '{if (NR < 3) print $0 > "/dev/stderr"; else print $0}' 2> file_sorted.txt | sort >> file_sorted.txt

方法#2:

cat file.txt | awk '{if (NR < 3) print $0 > "file_sorted.txt"; else print $0}' | sort >> file_sorted.txt

答案 3 :(得分:0)

使用awk

awk '{ if ( NR > 2 ) { print $0 } }' file.txt | sort

NR是内置awk变量,包含当前记录/行号。它从1开始。

答案 4 :(得分:0)

您可以尝试以下方法:

(read line; echo "$line"; sort) < file.txt

它需要一行并回显它,然后对其余部分进行排序。您还可以:

file.txt | (read line; echo "$line"; sort)

对于两行,只需重复读取和回显即可:

(read line; echo "$line"; read line; echo "$line"; sort) < file.txt

答案 5 :(得分:0)

使用 awk 扩展 Vigneswaran R 的答案:

使用 tty 获取您当前终端的 stdin 文件,在 awk 中将前三行直接打印到您的终端(不,它不会运行输入)并将其余行通过管道进行排序。

tty
>/dev/pts/3

cat file.txt | awk '{if (NR < 3) print $0 > "/dev/pts/3"; else print $0}' | sort