小编agc*_*agc的帖子

Bash decimal to base 62 conversion

我想反转以下bash命令执行的操作:

$ echo $((62#a39qrT))
9207903953
Run Code Online (Sandbox Code Playgroud)

即将十进制9207903953转换为基数62,保持bash标准{0..9},{a..z},{A..Z}.

我知道我可以通过使用来实现这一点bc,但我必须手动转换每个字符.例如,我目前这样做:

BASE62=($(echo {0..9} {a..z} {A..Z}))
for i in $(echo "obase=62; 9207903953" | bc)
do
    echo -n ${BASE62[$i]} #Doesn't work if bc's output contains leading zeroes
done
Run Code Online (Sandbox Code Playgroud)

必须有一种方法以较少"黑客"的方式做到这一点.你知道如何更有效地做到这一点吗?

编辑:更改bc输入.

bash shell base-conversion bc

10
推荐指数
1
解决办法
3643
查看次数

使用grep提取列

我有一个数据框,其中包含> 100列,每列均标有唯一字符串。第1列代表索引变量。我想用一个基本的UNIX命令提取索引列(列1)+一个特定的列串使用grep

例如,如果我的数据框如下所示:

Index  A  B  C...D  E  F
p1     1  7  4   2  5  6
p2     2  2  1   2  .  3
p3     3  3  1   5  6  1
Run Code Online (Sandbox Code Playgroud)

我想使用一些命令仅提取我将用指定的“ X”列grep,并同时显示第1列和第grepd 列。我知道我可以cut -f1 myfile在第一篇文章中使用,但需要grep每列的帮助。作为一个更具体的示例,如果我的grep短语是“ B”,我希望输出为:

Index  B
p1     7
p2     2
p3     3
Run Code Online (Sandbox Code Playgroud)

我是UNIX的新手,在类似示例中找不到很多东西。任何帮助将非常感激!!

unix grep

9
推荐指数
2
解决办法
4万
查看次数

将文件中每行的第一个字母更改为大写

我需要将文件中每行的第一个字母更改为大写,例如

the bear ate the fish.
the river was too fast.
Run Code Online (Sandbox Code Playgroud)

会成为:

The bear ate the fish.
The river was too fast.
Run Code Online (Sandbox Code Playgroud)
  • 该文件包含一些特殊字母:a,a,á,à,ǎ,ā,b,c,d,e,e,é,è,ě,ē,f,g,h,i,i,í,ì ,ǐ,ī,j,k,l,m,n,o,o,ó,ò,ǒ,ō,p,q,r,s,t,u,u,ú,ù,ǔ,ü,ǘ ,ǜ,ǚ,ǖ,ū,v,w,x,y和z.
  • 这些字母的大写形式是:A,A,Á,À,Ǎ,Â,B,C,D,E,E,É,È,Ě,Ē,F,G,H,I,I,Í, Ì,Ǐ,Ī,J,K,L,M,N,O,O,Ó,Ò,Ǒ,Ō,P,Q,R,S,T,U,U,Ú,Ù,Ǔ,Ü, Ǘ,Ǜ,Ǚ,Ǖ,Ū,V,W,X,Y和Z.

如何将文件中每行的第一个字母更改为大写?

bash case unicode-string

8
推荐指数
3
解决办法
9657
查看次数

为什么gnu并行分块会改善gzip的压缩大小?

档案下:"意外效率部门"

前9000万个数字约占761MB,输出为:

 seq 90000000
Run Code Online (Sandbox Code Playgroud)

根据man parallel它,它可以gzip通过切断输入并使用不同的CPU来压缩块来加速归档大文件.因此即使gzip单线程,这种技术也使它成为多线程:

seq 90000000  | parallel --pipe --recend '' -k gzip -9 >bigfile.gz
Run Code Online (Sandbox Code Playgroud)

在Intel Core i3-2330M(4)@ 2.2GHz上花了46秒.

管道到老了gzip:

seq 90000000  | gzip -9 > bigfile2.gz
Run Code Online (Sandbox Code Playgroud)

在相同的CPU上花了80秒.现在出人意料:

ls -log bigfile*.gz
Run Code Online (Sandbox Code Playgroud)

输出:

-rw-rw-r-- 1 200016306 Jul  3 17:27 bigfile.gz
-rw-rw-r-- 1 200381681 Jul  3 17:30 bigfile2.gz
Run Code Online (Sandbox Code Playgroud)

300K更大?这看起来不对.首先,我检查zdiff文件是否具有相同的内容 - 是的,相同.我认为任何压缩器在连续数据流方面都会比分块数据流做得更好.为什么不bigfile2.gz小于bigfile.gz

linux shell gzip chunking gnu-parallel

8
推荐指数
1
解决办法
465
查看次数

将大量文件传递给stdin,提取第一列,然后将它们组合到一个新文件中

假设我们有这两个文件:

$ cat ABC.txt 
ABC DEF

$ cat PQR.txt 
PQR XTZ
Run Code Online (Sandbox Code Playgroud)

我们希望用每个文件的第1列形成一个文件.这可以通过以下方式实现:

$ paste -d ' ' <(cut -d ' ' -f 1 ABC.txt) <(cut -d ' ' -f 1 PQR.txt )
ABC PQR
Run Code Online (Sandbox Code Playgroud)

但是我想在输入中使用大量的文件,不仅是ABC.txt和PQR.TXT,还有很多.我们如何概括这种情况来传递集合中的每个文件以剪切然后将所有输出传递给粘贴(我知道这可以用awk做得更好,但我想知道如何使用这种方法解决这个问题).


编辑1

我发现了一种肮脏,肮脏的方式:

$ str='';  for i in *.txt; \
           do    str="${str} <(cut -d ' ' -f 1 ${i})"; \
           done ; \
  str="paste -d ' ' $str"; \
  eval $str
Run Code Online (Sandbox Code Playgroud)

但请,让我的灵魂释放一个不涉及计算机科学地狱的答案.

编辑2

如果这很重要,每个文件可以有n行.

bash shell stdin cut paste

7
推荐指数
1
解决办法
177
查看次数

使用jq分配多个输出变量

我试图用来jq解析来自TVDB api的信息。我需要提取几个字段,并将值分配给可以在bash脚本中继续使用的变量。我知道我可以通过bash轻松地将输出分配给一个变量,variable="$(command)"但是我需要输出来产生多个变量,并且我不想使用多个命令。

我阅读了此文档:

https://stedolan.github.io/jq/manual/v1.5/#Advancedfeatures

但我不知道这是否与我要执行的操作有关。

jq '.data' 产生以下输出:

[
  {
    "absoluteNumber": 51,
    "airedEpisodeNumber": 6,
    "airedSeason": 4,
    "airedSeasonID": 680431,
    "dvdEpisodeNumber": 6,
    "dvdSeason": 4,
    "episodeName": "We Will Rise",
    "firstAired": "2017-03-15",
    "id": 5939660,
    "language": {
      "episodeName": "en",
      "overview": "en"
    },
    "lastUpdated": 1490769062,
    "overview": "Clarke and Roan must work together in hostile territory in order to deliver an invaluable asset to Abby and her team."
  }
]
Run Code Online (Sandbox Code Playgroud)

我尝试过jq '.data | {episodeName:$name}'jq '.data | …

bash television jq

7
推荐指数
2
解决办法
5680
查看次数

在自定义手册页中包含来自外部文件或shell命令的变量?

我正在编写一些自定义man页面,我希望包含可能经常更改的内容,例如man页面编写的日期.

例如,一个是在git 回购中,我想更新man页面的日期,无需手动更改.

是否有可能#include*roff文件中调用shell变量,或者可能是markdown文件,然后使用pandoc" 编译 " man页面?

我知道这是一个奇怪的问题,但我没有遇到过类似的问题.

请注意,这与简单地包含$MANPATH要调用的手册页不同man.

IE,我想使用类似的东西:

.TH foo 10 "$(git log -n1 | grep Date | tail -c 31)" "$(git branch | grep "*")"

而不是每次都必须手动更改日期和分支/头名称.无论是降价还是给予pandoc或其他内容,还是roff文件本身,我都可以.

linux shell manpage include

7
推荐指数
1
解决办法
130
查看次数

如何从多个文件中提取一列,并将这些列粘贴到一个文件中?

我想从多个文件中提取第5列,按数字顺序命名,并将这些列按顺序粘贴到一个输出文件中.

文件名看起来像:

sample_problem1_part1.txt
sample_problem1_part2.txt

sample_problem2_part1.txt
sample_problem2_part2.txt

sample_problem3_part1.txt
sample_problem3_part2.txt
......
Run Code Online (Sandbox Code Playgroud)

每个问题文件(1,2,3 ......)都有两个部分(第1部分,第2部分).每个文件具有相同的行数.内容如下:

sample_problem1_part1.txt
1 1 20 20 1
1 7 21 21 2
3 1 22 22 3
1 5 23 23 4
6 1 24 24 5
2 9 25 25 6
1 0 26 26 7

sample_problem1_part2.txt
1 1 88 88 8
1 1 89 89 9
2 1 90 90 10
1 3 91 91 11
1 1 …
Run Code Online (Sandbox Code Playgroud)

linux shell paste

6
推荐指数
1
解决办法
9915
查看次数

将Unix`cal`输出转换为乳胶表代码:单线解决方案?

试图实现以下目标困扰我的想法:

将Unix cal输出转换为乳胶表代码,使用短而甜的单行(或几行).

例如cal -h 02 2012 | $magicline应该屈服

Mo      &Tu     &We     &Th     &Fr     \\
        &       & 1     & 2     & 3     \\
 6      & 7     & 8     & 9     &10     \\
13      &14     &15     &16     &17     \\
20      &21     &22     &23     &24     \\
27      &28     &       &       &       \\
Run Code Online (Sandbox Code Playgroud)

到目前为止,我能想出的唯一合理的解决方案是

cal -h | sed -r -e '1d' -e \
  's/^(..)?(...)?(...)?(...)?(...)?(...)?(...)?$/\2\t\&\3\t\&\4\t\&\5\t\&\6\t\\\\/'
Run Code Online (Sandbox Code Playgroud)

......我真的很努力.关于它的好处是,它简单易懂,易于理解,它是"不灵活"(它无法应付8周的一周)和一点点冗长.我正在寻找可供学习的替代解决方案;-)

编辑:找到另一个似乎可以接受的

cal -h | tail -n +2 |
    perl -ne 'chomp;
        $,="\t&";
        $\="\t\\\\\n";
        $line=$_; …
Run Code Online (Sandbox Code Playgroud)

bash shell perl awk sed

5
推荐指数
1
解决办法
464
查看次数

bash - 以十六进制表示法输入字符到标准输入

我想非ASCII字符(写0xfe0xed等),以一个程序的标准输入。

有很多类似的问题,但我没有找到答案,因为:

  • 我想写单字节字符,而不是 unicode 字符
  • 我不能通过管道输出echo什么的

在 OS X¹ 上,您可以测试:

nm - -
Run Code Online (Sandbox Code Playgroud)

我想将目标文件魔术字节(例如0xfeedface)写入nm使用标准输入,以便我可以看到它的行为方式并且可以重新编码。

如果我使用管道,则第二个参数-(即stdin)将永远不会匹配任何字节,因为所有标准输入都将转到第一个。当使用终端而不是管道时,我可以输入Ctrl + D第一个“关闭”,第二个开始读取。

我尝试使用Ctrl + Shift + UOS X 的 Unicode 十六进制输入,但它不起作用——我无法用它写出所需的字符。

我也尝试过使用剪贴板,pbcopy但它无法读取/粘贴非 ASCII 或非 unicode 字符。

我怎样才能实现我的目标?

不要犹豫编辑,因为这是一个难以表达的问题。

¹nm在 linux 上不处理stdin

bash hex stdin character-encoding

5
推荐指数
1
解决办法
6795
查看次数