簡體   English   中英

cut,colrm,awk和sed的奇怪問題:無法從管道流中剪切字符

[英]Strange problem with cut,colrm,awk and sed: fail to cut characters from a pipe stream

我創建了一個腳本來枚舉目錄中及其下面的所有文件。 我想通過使用pv添加一些進程反饋,因為我通常在根目錄中使用它。

問題是發現它的時間輸出總是包含小數秒(%TT),但我不想記錄這么多細節。

如果我編寫腳本來一次性完成所有事情,我會得到正確的輸出。 但是,如果我使用中間文件在“第二次”傳遞期間進行估計,結果會發生變化,我不明白為什么。

此版本給出了正確的結果:

#!/bin/bash

find -printf "%11s %TY-%Tm-%Td %TT %p\n" 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

但是排序可能需要很長時間,所以我嘗試了類似的東西,以獲得更多的反饋:

#!/bin/bash

TMPFILE1=$(mktemp)
TMPFILE2=$(mktemp)

# Erase temporary files before quitting
trap "rm $TMPFILE1 $TMPFILE2" EXIT

find -printf "%11s %TY-%Tm-%Td %TT %p\n" 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個“解決方案”都不起作用。 “.0000000000”部分保留在輸出中。

有人可以解釋原因嗎?

我的最終解決方案是將切割操作與查找結合起來,並僅使用一個臨時文件。 只有排序是單獨完成的。

您可以使用字段精度說明符(至少使用GNU find 4.4.2)截斷-printf參數中的秒數:

find -printf "%11s %TY-%Tm-%Td %.8TT %p\n"

其中八個字符留在“HH:MM:SS”中。

我的其余部分可能沒有實際意義:

你的#1-5不起作用的原因是wc的輸出包括文件名(尤其是空格)。 該空間使pvwc命令中看到文件名作為輸入文件。 命令行參數的優先級高於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 “排序wc -l $TMPFILE行...”

你會感覺從經驗中排出這么多行所需要多長時間。

吻它我的兒子,吻它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM