user7589566
user7589566

Reputation: 1

How can I paste contents of 2 files or single file multiple times?

I am using mostly one liners in shell scripting.

If I have a file with contents as below:

1
2
3

and want it to be pasted like:

1 1
2 2
3 3

how can I do it in shell scripting using python one liner?

PS: I tried the following:-

python -c "file = open('array.bin','r' ) ; cont=file.read ( ) ; print cont*3;file.close()"

but it printed contents like:-

1
2
3
1
2
3

Upvotes: 0

Views: 115

Answers (6)

Walter A
Walter A

Reputation: 20002

First test from the command propmt:

paste -d" "  array.bin array.bin

EDIT:
OP wants to use a variable n to show how much columns are needed. There are different ways to repeat a command 10 times, such as

for i in {1..10}; do echo array.bin; done
seq 10 | xargs -I -- echo "array.bin"
source <(yes echo "array.bin" | head -n10)
yes "array.bin" | head -n10

Other ways are given by https://superuser.com/a/86353 and I will use a variation of

printf -v spaces '%*s' 10 ''; printf '%s\n' ${spaces// /ten}

My solution is

paste -d" " $(printf "%*s" $n " " | sed 's/ /array.bin /g')

Upvotes: 0

cjhanks
cjhanks

Reputation: 544

REPEAT_COUNT=3 && cat contents.txt| python -c "print('\n'.join(w.strip() * ${REPEAT_COUNT} for w in open('/dev/stdin').readlines()))"

Upvotes: 0

jdavcs
jdavcs

Reputation: 151

Unfortunately, you can't use a simple for statement for a one-liner solution (as suggested in a previous answer). As this answer explains, "as soon as you add a construct that introduces an indented block (like if), you need the line break."

Here's one possible solution that avoids this problem:

  1. Open file and read lines into a list
  2. Modify the list (using a list comprehension). For each item:
    • Remove the trailing new line character
    • Multiply by the number of columns
  3. Join the modified list using the new line character as separator
  4. Print the joint list and close file

Detailed/long form (n = number of columns):

f = open('array.bin', 'r')
n = 5
original = list(f)
modified = [line.strip() * n for line in original]
print('\n'.join(modified))
f.close()

One-liner:

python -c "f = open('array.bin', 'r'); n = 5; print('\n'.join([line.strip()*n for line in list(f)])); f.close()"

Upvotes: 0

Anomitra
Anomitra

Reputation: 1161

file = open('array.bin','r' )
cont = file.readlines()
for line in cont:
    print line, line
file.close()

Upvotes: 1

Stephen Rauch
Stephen Rauch

Reputation: 49794

You need to break up the lines and then reassemble:

One Liner:

python -c "file=open('array.bin','r'); cont=file.readlines(); print '\n'.join([' '.join([c.strip()]*2) for c in cont]); file.close()"

Long form:

file=open('array.bin', 'r')
cont=file.readlines()
print '\n'.join([' '.join([c.strip()]*2) for c in cont])
file.close()

With array.bin having:

1
2
3

Gives:

1 1
2 2
3 3

Upvotes: 0

ForceBru
ForceBru

Reputation: 44838

You could replace your print cont*3 with the following:

print '\n'.join(' '.join(ch * n) for ch in cont.strip().split())

Here n is the number of columns.

Upvotes: 0

Related Questions