关于macos:用标签替换除第一个空格以外的所有空格

Replace all but first space with tabs

我有一系列管道化的bash命令

1
2
3
4
5
grep A01929 test_FTF89MNR.txt |
    grep status |
    tr"=""" |
    tr",""" |
    cut -d"" -f 1 -f 2 -f 11 -f 14 -f 17

它产生一大堆输出,看起来像这样

1
2
3
...    
2016-02-25 09:15:01.41 2742 1535 1796
...

为了便于导入到Excel,我想用制表符替换列之间的所有空白,除了第一个分隔数据和时间的空白。所以目标输出是

1
2
3
...    
2016-02-25 09:15:01.41\t2742\t1535\t1796
...

有没有一个简单的命令行fu,我可以粘到我的管道链来完成这一点?tr似乎没有什么东西可以让它进行测距。我在OS X上。


您可以使用awk精确地指定分隔符。

1
awk '{print $1"" $2"\t" $3"\t" $4"\t" $5}' Input.txt


为了进一步说明梅林提出的关于awk的建议,你可以用awk代替你对cut的使用,而不是做额外的后处理。您可以用一个来替换您对tr的两个呼叫:

1
2
3
4
grep A01929 test_FTF89MNR.txt |
    grep status |
    tr"=,""" |
    awk '{print $1"" $2"\t" $11"\t" $14"\t" $17}'

有了原始文件的一个摘录,我相信有人会想出一个全方位的cx1〔7〕版本。


和塞德在一起变得可爱可以帮助你-把它们全部换掉,然后把第一个背换掉,例如。

江户十一〔四〕号

例如

埃多克斯1〔5〕

正如评论中所指出的,这是Mac,所以不会起作用。这里有一个如何处理Mac上标签的链接。

或者,这里有一个全awk版本取代了所有的管道。埃多克斯1〔6〕

匹配一行上的两个grepped值,然后替换,=for nothing,然后打印所需的分隔符。


您可以对sed使用以下技巧:首先用制表符替换所有空格,然后只替换一个。下面是一个示例:

1
echo"a b c d" | sed 's/ /:/g;s/:/ /'

第一个sed命令s/ /:/g将全局(因此是g)所有空格替换为冒号,第二个命令将第一个冒号替换为空白。这将把字符串a b c d变成a b:c:d


如果有固定的字段数据,可以在bash中使用read循环:

1
2
3
4
5
6
txt="2016-02-25 09:15:01.41 2742 1535 1796"

while read -r da ti f1 f2 f3
do
    printf"%s %s\t%s\t%s\t%s" $da $ti $f1 $f2 $f3
done <<< $txt