我希望能够对文件进行排序,但仅限于某一行及以下。从手动排序无法解析内容所以我需要第二个实用程序来执行此操作。读?或者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
这是相当新的,脚本看起来像是缺少一些东西。此外,不知道如何从某个行号开始。
有什么想法吗?
答案 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