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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |