【问题标题】:Find Longest Line in a .txt File and fill all Lines to that Length with 'blank Spaces'?在 .txt 文件中查找最长的行并用“空格”填充所有行到该长度?
【发布时间】:2010-06-24 16:27:04
【问题描述】:

如何在 .txt 文件中找到最长的行,然后在所有其他行的末尾用空格填充到该长度?

我猜这很容易回答。我对使用 awk, paste 命令知之甚少 等等。也许有人可以帮助我。谢谢!

更具体一点...到目前为止,我可以做到以下几点。这将从 .txt 文件中获得最长的行:

awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' in.txt

这会用空格填充行(直到 50):

awk  'length <= 50 { printf "%-50s\n",$0 }' in.txt > out.txt

我只是不知道将值从一行传递到另一行。

我为什么要问这个?我想使用 paste 命令合并两个 .txt 文件。文本 B 将位于文本 A 的右侧。文本 A 中的行将具有不同的长度。因此,如果没有足够的空格,则布局不正确。

【问题讨论】:

  • 一如既往,请发布您迄今为止尝试过的内容 - 解决问题,做你的功课,不。

标签: bash text macos shell


【解决方案1】:

通常我发现这类问题是这种思考过程的结果:

  1. 我正在尝试解决问题 A
  2. 我认为做流程 B 会解决 A
  3. 请问如何实现流程B

您将获得有关如何实现流程 B 的字面答案 - 但如果您包括 在问题 A 的背景下,您会得到更好的答案,并且可能会得到解决 问题 A 比过程 B 更简单。

那么,您想通过使文件中的所有行长度相同来解决什么问题?

【讨论】:

  • 是的,抱歉不够具体。我想用“粘贴”命令合并 2 个 .txt 文件。文本 B 将位于文本 A 的右侧。文本 A 中的行将具有不同的长度。因此,如果没有足够的“空格”,则布局不正确。
  • 用户将如何查看此文件?如果您将其设为简单的 HTML 文件,则将文件 A 中的文本放在文件 B 中的文本旁边,就像将文本包装在具有两列的单行表中一样简单。完全不涉及文件处理。
【解决方案2】:

这就是你所需要的:

pr  -W 80 -mtT file1 file2

或者,更详细地说:

pr --page-width=80 --merge --omit-header --omit-pagination file1 file2

改变数字以改变结果的布局。

【讨论】:

  • @noexpert:它们在哪些方面不起作用?如果你能更具体一点,我会更有帮助。
【解决方案3】:

您可以使用wc 计算一行中的字符数。测量文件中的所有行以找到最长的长度。对于所有其他文件,(max length - line length) 为您提供了要在行尾打印的空格字符数(您可以使用 printf 执行此操作)。

更新: 是否需要使用awk?如果没有,试试这个:

# Measure the longest line in the file
maxlen=`wc -L filename.txt | cut -d ' ' -f 1`

# Pad each line to $maxlen characters
while read line
do
    printf "%-${maxlen}s\n" "$line" >> outfile.txt
done < filename.txt

编辑#2: 如果wc 没有-L 选项,则可以使用以下循环计算最长行的长度:

maxlen=0
while read line
do
    thislen=`echo $line | wc -c`
    [ $[$thislen>$maxlen] ] && maxlen=$thislen
done < filename.txt

$maxlen 的结束值将是最长行的长度。

【讨论】:

  • 是的,也已经偶然发现了这一点。谢谢。见上文,我试图更具体。
  • 不幸的是,在 mac os x 上的 wc 中没有给出选项 '-L' 也不是 'wc --max-line-length'
【解决方案4】:

这里是使用 awk 的一种方法。

$ more file
jlsf
slf
asdfasfs
sd

$ awk 'FNR==NR{t=(length>=t)?length:t;next}length<t{for(o=1;o<=t-length;o++)s=s "|";$0=$0s;s=""}1' file file
jlsf||||
slf|||||
asdfasfs
sd||||||

更改“|”根据需要到空间。

【讨论】:

  • 这就是我想要的。它就像一个魅力。非常感谢您和所有花一点时间提供帮助的人。
【解决方案5】:

如果“shell 脚本”可以包含 Python 脚本,如下所示:

maxLen = 0
infile = open("file.txt", 'r')
outfile = open("out.txt", 'w')
for line in infile:
    if len(line)>maxLen: maxLen = len(line)
infile.seek(0)
for line in infile:
    rawline = line.strip('\r\n')
    out.write (rawline + ''.join([' ' for i in range(maxLen-len(rawline))]) + "\n")
infile.close ()
outfile.close ()

修复任何一个错误的错误留给读者作为练习! :-)

【讨论】:

  • 两个for循环之间需要倒带操作吗?
  • 你能利用 Python 类似的 'printf("%.80s\n", line)' 来做空白填充,其中 80 是计算出的最大行长度?您将在第一次通过文件后创建格式字符串。
  • @Jon - 是的,已修复 :-) 你可能会做一些类似聪明的格式字符串的事情,它肯定会更简洁!
  • 希望,我不需要 python,那对我来说将是一个全新的领域...... :(
【解决方案6】:

wc -Lwc --max-line-length 计算并显示输入中最长行的长度(可能不适用于所有版本的 wc)。


在某个变量(例如,$max)中使用最大行长度,运行

while read line
do
    printf "%-${max}s\n" $line
done < in.txt > out.txt

【讨论】:

  • 是的,已经绊倒了。谢谢。见上文,我试图更具体。
【解决方案7】:

你可以结合你的原创想法:

awk '{ if (length($0) &gt; max){max = length($0)} } END { print max }' in.txt

awk 'length &lt;= 50 { printf "%-50s\n",$0 }' in.txt

使用 shell 变量将结果从一个脚本传递到另一个脚本,使用 awk 的 -v 参数解析

MAX=$(awk '{ if (length($0) &gt; max){max = length($0)} } END { print max }' in.txt)

awk -v max=$MAX 'length &lt;= max { printf "%-"max"sX\n",$0 }' in.txt

或者你可以用 shell $() 命令替换替换硬编码的50 来创建这个丑陋的单行野兽:

awk -v max=$(awk '{ if (length($0) &gt; max){max = length($0)} } END { print max }' in.txt) 'length &lt;= max { printf "%-"max"s\n",$0 }' in.txt

【讨论】:

    猜你喜欢
    • 2011-03-22
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    相关资源
    最近更新 更多