我正在尝试使用“tr”命令,并使用它的-d delete选项。我的目的是按照访问日期的顺序重新排列文件列表。
我有一个文件orderedFile,其中包含以下内容:
Access: 2014-02-09 21:35:36.642598731 -0700 0) accessedfiles.cpp
Access: 2014-02-10 14:24:01.527811265 -0700 1) accessedfiles.sh
Access: 2014-02-10 14:24:03.563811320 -0700 2) onlyFilesListFile
Access: 2014-02-10 14:24:03.563811320 -0700 3) orderedFile
Access: 2014-02-10 14:23:37.623810616 -0700 4) properlyOrdered
Access: 2014-02-10 14:23:37.543810614 -0700 5) smallestToLargest
Access: 2014-02-09 21:35:36.642598731 -0700 6) strace.txt
Access: 2014-02-09 21:35:36.638598730 -0700 7) sum.cpp
Access: 2014-02-10 13:24:54.415715076 -0700 8) test
Access: 2014-02-09 21:35:36.638598730 -0700 9) testFile
然后我使用命令tr -d'Access:'来切断每行的Access部分(这是通过每行上的bash脚本完成的)并且我在newOrdered的新文件中得到以下输出:
2014-02-09213536.642598731-07000)adfil.pp
2014-02-10142401.527811265-07001)adfil.h
2014-02-10142403.563811320-07002)onlyFilLitFil
2014-02-10142403.563811320-07003)ordrdFil
2014-02-10142337.623810616-07004)proprlyOrdrd
2014-02-10142337.543810614-07005)malltToLargt
2014-02-09213536.642598731-07006)tra.txt
2014-02-09213536.638598730-07007)um.pp
2014-02-10132454.415715076-07008)tt
2014-02-09213536.638598730-07009)ttFil
所以我现在正好在正面和东面使用grep on,但是文件名已经变得非常时髦和压缩了。知道为什么吗?他们现在很难与他们的全名相匹配。
答案 0 :(得分:3)
实际上这是错误的命令:
tr -d 'Access: '
因为它会删除字母a,c,e,s的每次出现:
您需要sed
:
sed 's/^ *Access: //'
答案 1 :(得分:2)
使用sed
:
sed -e 's/^Access: //' orderedFile
如果您只想要文件名:
sed -e 's/^.*) //' orderedFile
在tr
的联机帮助页中,您可以看到:
-d, --delete
delete characters in SET1, do not translate
所以你 做的是删除字符A
,c
,e
,s
,:
和(空格),这就是你得到乱码文件的原因。
答案 2 :(得分:1)
命令tr -d 'Access:'
不只是删除完整的单词'Access:',它会删除字符串'Access:'中出现的每个字母的每个实例。见man tr
(http://linux.die.net/man/1/tr)。
删除完整字词的好工具是sed
;你可以尝试以下方法:
sed 's/^Access: //' orderedFile > properlyOrdered
答案 3 :(得分:1)
awk替代方案:
awk -F'^Access: ' '$NF=$NF' OFS='' file
答案 4 :(得分:0)
tr不适合这个,怎么样切?
cut -c 9- < file
答案 5 :(得分:0)
鉴于您选择代表日期的格式具有字母顺序的质量与日期/时间顺序相同 - 您可以对文件进行排序,而无需使用
来删除行sort -k2,3 <filename>
(使用字段2和3排序)。