我需要转换完整行的文件,如下所示:
# 2007 4 29 10 1 17.98 blah other stuff
格式为这样的行
2007.04.29.10.01.17
原始行以空格分隔,当出现一个位数位数(例如4)时,它会被列为“4”。当我转换它时,我需要能够将它改为'04'。因此,有空格分隔文件,空格是前导零的占位符。
我需要编写一个shell脚本来进行转换。我尝试使用cut命令,因为每个字符都保持在同一个位置,因此第7个字符始终是分隔空格,第8个字符始终是十位数,或者应该是前导零的空格。然而,我很快发现它将两个空格视为一个,这完全抛弃了计数(因为有时候我有'4',有时我会'14'。
所以:我需要一种方法来读取和转换这个文件,使用cut或其他方法(awk?),这将允许我这样做。无论是修改我当前代码的方法(下面)还是其他可以更好地工作的方法都将非常感激。
仅供参考,我现在的代码如下:
while read LINE
do
#IF line starts with '#', then
if [[ $LINE == "#"* ]]; then
#123456789012345678901
# 2008 12 26 11 26 20.36
# 2007 5 10 1 8 10.52
#GET 4 digit year
LINEyear=$(echo $LINE | cut -c3-6)
#GET 2 digit month
if [ $(echo $LINE | cut -c8-8) == " " ]; then
LINEmonth=0$(echo $LINE | cut -c8-9)
else
LINEmonth=$(echo $LINE | cut -c8-9)
fi
#GET 2 digit day
if [ $(echo $LINE | cut -c11-11) == " " ]; then
LINEday=0$(echo $LINE | cut -c11-12)
else
LINEday=$(echo $LINE | cut -c11-12)
fi
#GET hour, min, sec, (Removed to save space)
LINEnew=$LINEyear.$LINEmonth.$LINEday.$LINEhour.$LINEmin.$LINEsec
echo $LINEnew
fi
done
答案 0 :(得分:2)
您可以在awk的一行中解决此问题:
% awk '/^#/ {printf "%04d.%02d.%02d.%02d.%02d.%02d\n", $2, $3, $4, $5, $6, $7}' ~/stuff
收率:
2007.04.29.10.01.17
答案 1 :(得分:1)
echo "# 2007 4 29 10 1 17.98 blah other stuff" | tr -s " "
我将tr
与cut
结合使用,因为空格分隔的可变性,tr -s ' '
修剪了多个空格。
然后,使用cut
忽略#(除非你想要它作为一个字段),然后第二次选择,说第四个字段:
echo "# 2007 4 29 10 1 17.98 blah other stuff" | tr -s " " | cut -d'#' -f2 | cut -d' ' -f4