Bash 为什么Awk';s print在格式化两个简单的管道字段时表现得很疯狂?
晚上好 我在处理awk的最后一个字段时遇到了一个奇怪的现象,我想与您分享。Bash 为什么Awk';s print在格式化两个简单的管道字段时表现得很疯狂?,bash,awk,sed,Bash,Awk,Sed,晚上好 我在处理awk的最后一个字段时遇到了一个奇怪的现象,我想与您分享。 我有一个社交网络日志文件,其中包含一些用|分隔的字段。 这些字段在imho中不重要,但它们出现在此格式中。 id | name | lastname | | |社交|媒体|使用(无任何内容) 有9个单独的字段 每行包含一个用户。e、 g.^随机数字|阿里斯|某物| | |脸书$$ 我们的目标是找到一种方法,为每一个使用的社交媒体找到一个总数 grep -v '^#' $3 | awk -F\| '{print $9}'
我有一个社交网络日志文件,其中包含一些用|分隔的字段。 这些字段在imho中不重要,但它们出现在此格式中。
id | name | lastname | | |社交|媒体|使用(无任何内容)
有9个单独的字段 每行包含一个用户。e、 g.^随机数字|阿里斯|某物| | |脸书$$ 我们的目标是找到一种方法,为每一个使用的社交媒体找到一个总数
grep -v '^#' $3 | awk -F\| '{print $9}' | sort | uniq -c | awk '{print $1$2}'
第一个命令从我的文件中删除被视为注释的#
第二个命令查找并打印字段9,该字段对应于该字段
使用的社交媒体。这是最后一个字段,因此我猜它将在\n结尾
之后,我对字段进行排序和计数,最后一个awk按如下方式打印输出:
884Blogger
1105Facebook
1326Flickr
1104Google+
1105Instagram
1105LinkedIn
1325Twitter
1546Youtube
Blogger
884
Facebook
1105
Flickr
1326
Google+
1104
Instagram
1105
LinkedIn
1105
Twitter
1325
Youtube
1546
如果我在最后一次尝试此命令:awk{print$2$1}然后发生了一些奇怪的事情。
如果我将其存储在一个文件中,我可以看到如下所示:
884Blogger
1105Facebook
1326Flickr
1104Google+
1105Instagram
1105LinkedIn
1325Twitter
1546Youtube
Blogger
884
Facebook
1105
Flickr
1326
Google+
1104
Instagram
1105
LinkedIn
1105
Twitter
1325
Youtube
1546
如果我试图从终端查看输出表单,我会看到:
884gger
1105book
1326kr
1104le+
1105agram
1105edIn
1325ter
1546ube
所需输出为:博客884
Facebook 1105
Flickr 1326
谷歌+1104
Instagram 1105
LinkedIn 1105
推特1325
Youtube 1546 我搜索了所有关于sed或awk的RS、ORS或FRS的信息,我也尝试了printf或print,但我找不到任何匹配的,甚至在同一行中几乎没有单词空间号。无论我如何打印这些行。但是,当我试图打印一个虚拟文件时,我从main复制粘贴了20行,一切都很顺利。同样,如果我尝试打印f或打印字段8或7,一切都很顺利
这个问题的解决方案在哪里?在9500个文件的长文件中?或者在单词后面有换行符?您认为如何?您的数据很可能包括
\r\n
行尾。第一次运行dos2unix文件
您也可以使用此功能消除大多数管道
$ awk -F\| '!/^#/{a[$9]++} END{for(k in a) print k,a[k]}' file | sort
您的数据很可能包括
\r\n
行结尾。第一次运行dos2unix文件
您也可以使用此功能消除大多数管道
$ awk -F\| '!/^#/{a[$9]++} END{for(k in a) print k,a[k]}' file | sort
替换为GNU awk:
awk '{print $2$1}'
与
处理Unix和DOS/Windows行结尾。替换为GNU awk:
awk '{print $2$1}'
与
处理Unix和DOS/Windows行结尾。请在问题中添加示例输入(多行)和该示例输入所需的输出。一个单词
dos2unix
。。。或者awk-v RS=“\r?\n”…
multichar-RS需要GNUawk
@JamesBrown:您的速度快了一点。请将示例输入(多行)和该示例输入所需的输出添加到您的问题中。一个字dos2unix
。。。或者awk-vrs=“\r?\n”…
multichar-RS需要GNUawk
@JamesBrown:你快了一点。非常感谢!我的代码(在逗号之后)工作得很好。一个小的细节改进:将*
替换为{0,1}
非常感谢!我的代码(在逗号之后)工作得很好。一个小的细节改进:用{0,1}
'!/^#/确实移除了一根管道。这是真的。谢谢!!/^#/确实拆下了一根管子,是真的,谢谢!