【问题标题】:Shell command - tr,sort,paste,nlShell 命令 - tr,sort,paste,nl
【发布时间】:2020-12-15 23:08:44
【问题描述】:

我有这个任务

FILE 变量是正好包含 30 行的文本文件的名称。每行仅包含一个单词,由大小写字母和数字组成。

更改此文件,使单词中的所有数字消失,所有字母变为小写,并且修改后的单词按字母升序排序。修改后的文件将具有三列单独表格的格式,其中第一列将包含排序后的前 10 个单词,第二列包含第二个 10 个单词,其余为第三个。为文件的行编号。

input:

hUeY65u
9sjKdfh
A56oi4
22cfe4HW
Gws6K
zh71p6t
...

output:
     1  aoi     gwsk    sjkdfh
     2  cfehw   hueyu   zhpt
     ...

我创建了这个脚本,它适用于我,但不适用于学校服务器。你不知道问题可能出在哪里。谢谢

cat $FILE | tr '[:upper:]' '[:lower:]' | tr -d "[0-9]" | sort >file1.txt;  
split -l 10 file1.txt; paste xaa xab xac >file2.txt; nl file2.txt; 



    Stderr mismatch:
-----expected-----

--------got-------
/home/blxrpcdcgb/Student: line 1: $FILE: ambiguous redirect
paste: xaa: No such file or directory

------------------
'"$HOME"/file1.txt' is excessive.
'"$HOME"/file2.txt' is excessive.
'"$HOME"/kfekd  jojny' has incorrect content:
-----expected-----
     1  azkxbj  ikrmp   rynlv
     2  bledfoa jttknol sipei
     3  cdquayr jxphn   tatuqun
     4  csglb   llnsly  vjyqfl
     5  dwuzei  loxrha  vpjjhqf
     6  egs moxia   wbbvk
     7  enzvxg  ozaww   wmiik
     8  fuvks   ph  wpy
     9  gnbjr   phcupa  xsovhv
    10  hdjufth pisza   zuumxy

--------got-------
1sipei
Vpjjhqf
moxIA
wmiik96
9ph32
ozaWW
egs30
Pisza09
jttknol
hdjufTH
ZuumXY
llnsLY
Tatuqun
ikrMP
loxrHA
dwuzei
wbbvk
Xsovhv
PhcuPA
2fuvKS
Wpy09
jxpHN
Bledfoa
VjyqFL
gnbjr
Cdquayr
csglb
8rynLV
azkxBJ
0enzvxg

------------------

【问题讨论】:

  • 不应该修改原文件吗?另请注意,没有其他选项的 nl 不会为空行编号。
  • 你怎么知道在学校服务器上不行?你运行它并得到不同的输出吗?
  • 你需要扩展评论它可以工作......但不能在学校服务器上;考虑更新问题以包含 $FILE 的完整内容以及在学校服务器上运行命令的完整输出
  • 也许“学校服务器”是指学校的作业提交服务,而不是OP有shell访问权限的机器。
  • 您的命令行本身没有任何问题。您将在 file2.txt 中创建已排序的列,然后 nl 将在 file2.txt 中以数字为前缀输出行您自己,或者您使用nl 的格式不正确。否则,你的命令行可以工作。

标签: bash shell sorting split tr


【解决方案1】:

您可以使用pr 来排列列。不需要中间文件:

tr [:upper:] [:lower:] < "${FILE}" \
| tr -d [:digit:] \
| sort \
| pr -t3 \
| nl

或一行:

tr [:upper:] [:lower:] < "${FILE}" | tr -d [:digit:] | sort | pr -t3 | nl

见:https://linux.die.net/man/1/pr

【讨论】:

  • 让我们直接去那里设置列,以便它们不是由制表符而是由空格分隔。不知怎的,我找不到它。还是通过 tr 来做?
  • 嘿,那是pr -s' ' -t3 .. 或pr -t3s' '
  • PS:您发布的错误,请确保$FILE 包含指向可读且现有文件的路径。
【解决方案2】:

使用 GNU awk 的替代解决方案:

awk '{ gsub(/[[:digit:]]/,"",$0); # Strip out the numbers
       map[tolower($0)]="" # Create an array with the line at the index in lower case
     } 
 END { PROCINFO["sorted_in"]="@ind_str_asc"; # Set the array sorting order
     for ( i in map ) { 
        printf "%s\t",i;cnt++; # Loop the array and print the entries. Also increment a count variable
        if (cnt==3 || cnt==6 || cnt==9) { printf "\n"  # When the count variable is 3,6 or 9 print a new line
        } 
        if (cnt==10) { printf "\n";exit # If the count is 10 exit
        } 
     } 
  }' file

一个班轮:

awk '{ gsub(/[[:digit:]]/,"",$0);map[tolower($0)]="" } END { PROCINFO["sorted_in"]="@ind_str_asc";for ( i in map ) { printf "%s\t",i;cnt++;if (cnt==3 || cnt==6 || cnt==9) { printf "\n" } if (cnt==10) { printf "\n";exit } } }' file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多