加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 按行长(包括空格)对文本文件进行排序

发布时间:2020-12-15 16:39:35 所属栏目:安全 来源:网络整理
导读:我有一个CSV文件,看起来像这样 AS2345,ASDF1232,Mr. Plain Example,110 Binary ave.,Atlantis,RI,12345,(999)123-5555,1.56AS2345,Mrs. Plain Example,1121110 Ternary st. 110 Binary ave..,Liberty City,110 Ternary ave.,Some City,1.56 我需要排序它的
我有一个CSV文件,看起来像这样
AS2345,ASDF1232,Mr. Plain Example,110 Binary ave.,Atlantis,RI,12345,(999)123-5555,1.56
AS2345,Mrs. Plain Example,1121110 Ternary st.                                        110 Binary ave..,Liberty City,110 Ternary ave.,Some City,1.56

我需要排序它的行长度包括空格。以下命令不会
包括空格,有没有办法修改它,所以它会为我工作?

cat $@ | awk '{ print length,$0 }' | sort -n | awk '{$1=""; print $0}'
回答
cat testfile | awk '{ print length,$0 }' | sort -n -s | cut -d" " -f2-

或者,对任何等长线进行原始(可能是无意的)子排序:

cat testfile | awk '{ print length,$0 }' | sort -n | cut -d" " -f2-

在这两种情况下,我们已经解决了你所声称的问题,从awk开始你的最后剪辑。

匹配长度的线 – 在领带的情况下做什么:

该问题没有指定是否需要进一步排序以匹配长度的行。我假设这是不必要的,并建议使用-s(–stable)来防止这些行相互排序,并保持它们在输入中出现的相对顺序。

(那些想要更多地控制排序这些关系的人可能会看到sort的–key选项。)

为什么问题的尝试解决方案失败(awk行重建):

有趣的是注意以下两者之间的区别:

echo "hello   awk   world" | awk '{print}'
echo "hello   awk   world" | awk '{$1="hello"; print}'

它们分别产生

hello   awk   world
hello awk world

relevant section of (gawk’s) manual只提到,当你改变一个字段时,awk将重建整个$ 0(基于分隔符等)。我想这不是疯狂的行为。它有这:

“最后,有时候强迫awk重建整个记录,使用字段和OFS的当前值是很方便的。为此,使用看似无害的赋值:

$1 = $1   # force record to be reconstituted
 print $0  # or whatever else with $0

“这迫使awk重建记录。

测试输入包括一些等长的线:

aa A line   with     MORE    spaces
bb The very longest line in the file
ccb
9   dd equal len.  Orig pos = 1
500 dd equal len.  Orig pos = 2
ccz
cca
ee A line with  some       spaces
1   dd equal len.  Orig pos = 3
ff
5   dd equal len.  Orig pos = 4
g

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读