微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用cut,colrm,awk和sed的奇怪问题:无法从pipe道stream中剪切字符

我已经创build了一个脚本来枚举目录下的所有文件。 我想通过使用pv来添加一些进度反馈,因为我通常从根目录使用它。

问题是find它的时间输出总是包含小数秒(%TT),但我不想logging这么多的细节。

如果我写一个脚本来完成所有的事情,我会得到正确的结果。 但是如果我使用中间文件在“秒”中进行估计,结果会发生变化,我不明白为什么。

这个版本给出了正确的结果:

linux命令行:剪切(带空字段)

如何使用unix脚本显示所有'n'个string的长串?

文件中查找HEX值并grep下面的值

如何获得有序列,定义列或除特定列之外或之后的所有列

从列X剪切,直到制表符分隔的文件结束

#!/bin/bash find -printf "%11s %TY-%Tm-%Td %TT %pn" 2> /dev/null | # - Remove the fractional seconds from the time # before: 4096 2011-01-19 22:43:51.0000000000 . # after : 4096 2011-01-19 22:43:51 . colrm 32 42 | pv -ltrbN "Enumerating files..." | # - Sort every thing by filename sort -k 4

但sorting可能需要很长时间,所以我尝试了类似的方法,以获得更多的反馈:

#!/bin/bash TMPFILE1=$(mktemp) TMPFILE2=$(mktemp) # Erase temporary files before quitting trap "rm $TMPFILE1 $TMPFILE2" EXIT find -printf "%11s %TY-%Tm-%Td %TT %pn" 2> /dev/null | pv -ltrbN "Enumerating files..." > $TMPFILE1 LINE_COUNT="$(wc -l $TMPFILE1)" #cat $TMPFILE1 | colrm 32 42 | #1 #cat $TMPFILE1 | cut -c1-31,43- | #2 #cut -c1-31,43- $TMPFILE1 | #3 #sed s/.0000000000// $TMPFILE1 | #4 awk -F".0000000000" '{print $1 $2}' $TMPFILE1 | #5 pv -lN "Removing fractional seconds..." -s $LINE_COUNT > $TMPFILE2 echo "Sorting list by filenames..." >&2 cat $TMPFILE2 | sort -k 4

5个“解决scheme”都不起作用。 “.0000000000”部分留在输出中。

有人能解释为什么吗?

我的最终解决scheme是将切割操作与查找结合起来,并只使用一个临时文件。 只有sorting是分开完成的。

使用linux剪切将一个字段分成两部分

如何从Perl的ls -lrt输出中查找/剪切文件

仅打印string中的第一个字段

两个tsv文件列的联合

如何用`cut`删除最后一个CR字符

您可以使用字段精度说明符(至少使用GNU find 4.4.2)将参数中的秒数截断为-printf :

find -printf "%11s %TY-%Tm-%Td %.8TT %pn"

这留下了“HH:MM:SS”中的八个字符。

我的答案的其余部分可能是没有意义的:

#1-5的原因是wc的输出包括文件名(尤其是空格)。 该空间导致pv从wc命令中查看文件名作为输入文件。 命令行参数的优先级高于stdin。 由于恰好与通过管道传递的输入文件相同,输出文件看起来像一个未处理的输入文件(因为它是,因为管道被忽略)。

只捕获没有文件名的计数:

LINE_COUNT=$(wc -l < "$TMPFILE1")

这里有一些小的改进:

< $TMPFILE1 colrm 32 42 | #1 No need for cat

要么

colrm 32 42 < $TMPFILE1 | #1 < $TMPFILE1 cut -c1-31,43- | #2

要么

cut -c1-31,43- < $TMPFILE1 | #2 sed s/.0000000000// $TMPFILE1 | #4 The dot should be escaped

如果这是一个真正的工具,而不仅仅是一个玩具,那么我就把“进度反馈”全部放在一起……也许回想起来,当它不复杂你的生活。 与此同时,你可能花费更多的时间来想出如何提供反馈,而不是等待你的脚本返回。

如果你绝对必须给一些反馈,然后只是回声“排序wc -l $TMPFILE行…”

你会感觉到需要花费多少时间才能从经验中筛选出如此多的线路。

吻我的儿子,吻它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐