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

前端之家收集整理的这篇文章主要介绍了bash – 按行长(包括空格)对文本文件进行排序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个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

猜你在找的Bash相关文章